Вопрос

В 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

из Справочник по разработчику Mozilla для Math.Round ()

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

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top