Проблема округления в 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