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

Однако этот подход будет вокруг к максимуму десятичных разрядов N, в то время как я хочу всегда вокруг к десятичным разрядам N. Например, "2.0" был бы округлен к "2".

Какие-либо идеи?

100
задан Dan Dascalescu 17 June 2019 в 18:58
поделиться

4 ответа

Это не проблема округления, это проблема отображения. Число не содержит информации о значащих цифрах; значение 2 совпадает с 2.0000000000000. Когда вы превращаете округленное значение в строку, вы заставляете ее отображать определенное количество цифр.

Вы можете просто добавить нули после числа, например:

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';

(Обратите внимание, что это предполагает, что региональные настройки клиента используют точку в качестве десятичного разделителя, код требует дополнительной работы для работы с другими настройками.)

23
ответ дан 24 November 2019 в 04:45
поделиться

Надеюсь, рабочий код (не много проверял):

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;
}
2
ответ дан 24 November 2019 в 04:45
поделиться

Вот ссылка на Javascript sprintf,

http://www.webtoolkit.info/javascript-sprintf.html

Вызов sprintf () - это одна из методологий округления в Perl, но {{1} } javascript изначально не имеет этой функции.

http://perldoc.perl.org/functions/sprintf.html

Помогает ли это?

0
ответ дан 24 November 2019 в 04:45
поделиться

Я нашел способ. Это код Кристофа с исправлением:

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".

50
ответ дан 24 November 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: