Javascript: форматирование округленного числа до N десятичных знаков
в JavaScript типичный способ округления числа до N десятичных знаков выглядит примерно так:
function roundNumber(num, dec) {
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
function roundNumber(num, dec) {
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
console.log(roundNumber(0.1 + 0.2, 2));
console.log(roundNumber(2.1234, 2));
Ответы
Ответ 1
Это не скругленный ploblem, это проблема отображения. Число не содержит информации о значимых цифрах; значение 2 совпадает с значением 2.0000000000000. Это когда вы поворачиваете округленное значение в строку, в которой вы показываете определенное количество цифр.
Вы можете просто добавить нули после номера, например:
var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
(Обратите внимание, что это предполагает, что региональные настройки клиента используют период как десятичный разделитель, для чего требуется еще одна работа для других настроек.)
Ответ 2
Я думаю, что существует более простой подход ко всем данным здесь, и это метод Number.toFixed()
, уже реализованный в JavaScript.
просто напишите:
var myNumber = 2;
myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"
и т.д...
Ответ 3
Я нашел способ. Это код Кристофа с исправлением:
function toFixed(value, precision) {
var precision = precision || 0,
power = Math.pow(10, precision),
absValue = Math.abs(Math.round(value * power)),
result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));
if (precision > 0) {
var fraction = String(absValue % power),
padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
result += '.' + padding + fraction;
}
return result;
}
Прочитайте подробности повторения символа с помощью конструктора массива здесь, если вам интересно, почему я добавил "+ 1".
Ответ 4
Всегда есть лучший способ сделать что-то.
var number = 51.93999999999761;
Я хотел бы получить точность в четыре цифры: 51.94
просто выполните:
number.toPrecision(4);
результат будет: 51.94
Ответ 5
Метод округления с использованием PHP-метода
Код ниже может быть использован для добавления вашей собственной версии Math.round в ваше собственное пространство имен, которое принимает параметр точности. В отличие от десятичного округления в приведенном выше примере это не выполняет преобразование в строки и из строк, а параметр точности работает так же, как PHP и Excel, в результате чего положительный 1 будет округлен до 1 десятичной точки и -1 будет округлен до десятков.
var myNamespace = {};
myNamespace.round = function(number, precision) {
var factor = Math.pow(10, precision);
var tempNumber = number * factor;
var roundedTempNumber = Math.round(tempNumber);
return roundedTempNumber / factor;
};
myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230
из ссылка разработчика Mozilla для Math.round()
Ответ 6
Надеюсь, что рабочий код (не проводил много тестирования):
function toFixed(value, precision) {
var precision = precision || 0,
neg = value < 0,
power = Math.pow(10, precision),
value = Math.round(value * power),
integral = String((neg ? Math.ceil : Math.floor)(value / power)),
fraction = String((neg ? -value : value) % power),
padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
return precision ? integral + '.' + padding + fraction : integral;
}
Ответ 7
Здесь ссылка на Javascript sprintf,
http://www.webtoolkit.info/javascript-sprintf.html
Вызов sprintf() - это одна методология округления в perl, но
javascript не имеет этой функции изначально.
http://perldoc.perl.org/functions/sprintf.html
Помогает ли это?
Ответ 8
Я думаю, что ниже функция может помочь
function roundOff(value,round) {
return (parseInt(value * (10 ** (round + 1))) - parseInt(value * (10 ** round)) * 10) > 4 ? (((parseFloat(parseInt((value + parseFloat(1 / (10 ** round))) * (10 ** round))))) / (10 ** round)) : (parseFloat(parseInt(value * (10 ** round))) / ( 10 ** round));
}
использование: roundOff(600.23458,2);
вернет 600.23
Ответ 9
Это работает для округления до N цифр (если вы просто хотите урезать до N цифр, удалите вызов Math.round и используйте один из Math.trunc):
function roundN(value, digits) {
var tenToN = 10 ** digits;
return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}
Раньше приходилось прибегать к такой логике в Java, когда я писал компоненты E-Slate для манипулирования данными. Это потому, что я обнаружил, что, добавляя 0,1 много раз к 0, вы получите неожиданно длинную десятичную часть (это связано с арифметикой с плавающей запятой).
Пользовательский комментарий в формате "Номер", чтобы всегда показывать 2 десятичных знака вызывает эту технику масштабирования.
Некоторые упоминают, что есть случаи, которые не округляются, как ожидалось, и на http://www.jacklmoore.com/notes/rounding-in-javascript/ вместо этого предлагается:
function round(value, decimals) {
return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
Ответ 10
Если вы не заботитесь о округлении, просто добавьте toFixed (x), а затем удалите конечные 0es и точку, если это необходимо. Это не быстрое решение.
function format(value, decimals) {
if (value) {
value = value.toFixed(decimals);
} else {
value = "0";
}
if (value.indexOf(".") < 0) { value += "."; }
var dotIdx = value.indexOf(".");
while (value.length - dotIdx <= decimals) { value += "0"; } // add 0's
return value;
}