§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().







Запись опубликована в рубрике JavaScript с метками , . Добавьте в закладки постоянную ссылку.

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

  1. alf говорит:

    Thanks! this great prototype.

  2. Anton говорит:

    Автор – ты великолепен.

Добавить комментарий

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

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>