Проблема округления в Math.round() &.toFixed()

Я использовал ниже два метода:

Number.prototype.myRound = function (decimalPlaces) {
    var multiplier = Math.pow(10, decimalPlaces);

    return (Math.round(this * multiplier) / multiplier);
};
alert((239.525).myRound(2));

Математически предупреждение должно быть 239.53, но оно дает 239.52 как вывод. Поэтому я попытался использовать функцию .toFixed(), и я получил правильный ответ.

Но когда я пытаюсь получить ответ для 239.575, он снова выводит неверный вывод.

alert((239.575).toFixed(2));

Здесь вывод должен быть 239.58, вместо этого он дает 239.57.

Эта ошибка создает разницу в бит в конечном выходе. Так может ли кто-нибудь помочь мне разобраться с этим?

Ответ 1

Этот метод даст очень правильный круглый результат.

function RoundNum(num, length) { 
    var number = Math.round(num * Math.pow(10, length)) / Math.pow(10, length);
    return number;
}

Просто вызовите этот метод.

alert(RoundNum(192.168,2));

Ответ 2

Внутри 239.575 невозможно точно представить. В двоичном формате 0,575 будет примерно 1/2 + 1/16 + 1/128 + 1/256 +....

Так получилось, что, представленный в двоичном формате, результат немного меньше 239.575. Поэтому Math.round округляется вниз.

Чтобы продемонстрировать, попробуйте следующее:

alert(239.575 - 239.5)

Вы ожидали, что результат будет 0.075, но вместо этого вы получите 0.07499999999998863.

Ответ 3

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

Смотрите также это: toFixed (2) раунды "x.525" непоследовательно?

Ответ 4

Просто используйте Math.round

function round(figureToRound){
    var roundOff = Math.round((figureToRound* 100 ).toFixed(2))/100;
    return roundOff;
}

console.log(round(1.005));

Это полностью исключает возможность округления.

Ответ 5

round() выполнит трюк. Попробуйте следующее:

var v= Math.round(239.575 * 100) / 100;
alert(v);

Рабочий FIddle

Ответ 6

В моем программном обеспечении я использую это:

(требуется DecimalJS)

Number.prototype.toFixed = function(fixed) {
    return (new Decimal(Number(this))).toFixed(parseFloat(fixed) || 
0);
};


var x = 1.005;
console.log( x.toFixed(2) ); //1.01

Ответ 7

function bestRound(val, decimals){
    decimals = decimals || 2;
    var multiplier = Math.pow(10, decimals)
    return Math.round((val * multiplier ).toFixed(decimals)) / multiplier;
  }

bestRound(239.575 - 239.5)   0.08
bestRound(239.575)         239.58
bestRound(239.525)         239.53
bestRound(1.005)             1.01