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;
}

Ответ 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;
}