§5. Гибкое округление чисел вместо Math.round()

Как это ни парадоксально, но в языке JavaScript нет штатной возможности округлять числа до нужного количества знаков после (или перед) запятой.

Устраненяем этого недоразумение.

Нам понадобится добавить еще один вспомогательный метод isInt(), который позволит отличать целые числа от дробных. Сам по себе он тоже представляет некоторую ценность и может оказаться полезным.

Number.prototype.isInt=function()
// возвращает True, если число является целым
{
  return (Math.round(this)==this);
}
Number.prototype.roundTo=function(n)
// округляет число до заданного количества n
// знаков после (или перед) запятой
{
  var x=0;
  if (typeof(n)=='number')
    if (n.isInt())
      if (n>=-6 && n<=6) x=n;
  x=Math.pow(10,x);
  return Math.round(this*x)/x;
}

Поскольку штатный метод round() округления до целого содержится в объекте Math, создадим для порядка в этом объекте метод-близнец для нашего Number.roundTo().

Math.roundTo=function(i,n)
// округляет число i до заданного количества n
// знаков после (или перед) запятой
{
  if (typeof(i)=='number')
    return i.roundTo(n);
  else
    return false;
}

Теперь можно использовать вот такие конструкции:

var x=12345.5678;
alert(x.isInt()); // выведет False

alert(x.roundTo(2)); // выведет 12345.57
alert(x.roundTo(-2)); // выведет 12300

alert(Math.roundTo(x,3)); // выведет 12345.568
alert(Math.roundTo(x,-1)); // выведет 12350

В завершение предлагаю испытать работу метода roundTo().

Введите число x
x.isFloatStr()


Math.roundTo(x,2)


x.roundTo()


x.roundTo(-2)

Не забудьте скачать и подключить всю библиотеку. В ней содержатся все рассмотренные здесь методы, а также многие другие.

4 комментария

  1. Есть одна проблема — удаляет незначащие нули в десятичной части числа.
    Например 4025.10 превращается в 4025.1

Добавить комментарий для DmitrichJ Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *