Как это ни парадоксально, но в языке 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)
Не забудьте скачать и подключить всю библиотеку. В ней содержатся все рассмотренные здесь методы, а также многие другие.
Thanks! this great prototype.
Автор — ты великолепен.
При 1000 000 итераций, работает на 100 мс быстрее, чем неправильный toFixed(n)
Есть одна проблема — удаляет незначащие нули в десятичной части числа.
Например 4025.10 превращается в 4025.1