JavaScript: форматирование округлого числа до N Decimals
-
19-09-2019 - |
Вопрос
В JavaScript типичный способ обойти номер и десятичные места - что -то вроде:
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));
Однако этот подход будет обойтись до максимум из n десятичных мест, пока я хочу всегда Круглый до N десятичных мест. Например, «2.0» будет округлена до «2».
Любые идеи?
Решение
Это не закругленная плата, это проблема дисплея. Число не содержит информацию о значительных цифрах; Значение 2 такое же, как 2,0000000000000. Когда вы превращаете закругленное значение в строку, которая вы отображаете определенное количество цифр.
Вы можете просто добавить нули после номера, что -то вроде:
var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
(Обратите внимание, что это предполагает, что региональные настройки клиента используют период в качестве десятичного сепаратора, код нуждается в некоторой работе, чтобы функционировать для других настроек.)
Другие советы
Я думаю, что здесь есть более простой подход, и это метод Number.toFixed()
Уже реализовано в JavaScript.
Просто напишите:
var myNumber = 2;
myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"
так далее...
Я нашел путь. Это код Кристофа с исправлением:
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».
Всегда есть лучший способ делать что -то.
var number = 51.93999999999761;
Я хотел бы получить четыре цифры точности: 51,94
просто сделать:
number.toPrecision(4);
Результат будет: 51,94
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
Надеюсь, рабочий код (не сделал много тестирования):
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;
}
Это работает для округления до n цифр (если вы просто хотите усечь на n цифры, удалите вызов Math.Round и используйте математику. Trunc One):
function roundN(value, digits) {
var tenToN = 10 ** digits;
return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}
Пришлось прибегнуть к такой логике в Java в прошлом, когда я был автором Компоненты манипуляции с данными электронного состава. Анкет То есть я обнаружил, что добавление 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);
}
Вот ссылка на JavaScript sprintf,
http://www.webtoolkit.info/javascript-sprintf.html
Призыв к Sprintf () - это одна методология округления в Perl, но JavaScript не имеет этой функции изначально.
http://perldoc.perl.org/functions/sprintf.html
Это помогает?
Я думаю, что ниже функция может помочь
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
Если вы действительно не заботитесь о округлении, просто добавили тофикс (x), а затем удалите Trainling 0ES и DOT, если это необходимо. Это не быстрое решение.
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;
}