Округлить до двух десятичных знаков, javascript
Я хочу, чтобы округлить число до двух десятичных знаков в JavaScript. Я нашел много постов на ТАКом высказывании .toFixed
Поведение метода непредсказуемо для разных браузеров.
И нашли это решение во многих местах, которые принимаются без исключения
Math.round(yournumber * 100 ) / 100
Но я нашел правильные, но некоторые неправильные результаты также из этого расчета, как
Math.round( 1.27532423 * 100 ) / 100 = 1.28 // this seems correct
Math.round( 1.275 * 100 ) / 100 = 1.27 // as I understand it should also 1.28
Math.round( 1.276 * 100 ) / 100 = 1.28
Я что-то упустил или мое понимание неверно?
редактировать
Только что нашел
1.275 * 100
возвращается 127.49999999999999
и это причина, если он вернется 127.5
, это даст правильный результат.
Но почему это возвращает это 127.49999999999999
????
4 ответа
Согласно @scott.korin комментарий изменен
Math.round( 1.27532423 * 100 ) / 100
в
Math.round( 1.27532423 * 10 * 10) / 100 // changed 100 to 10*10
и это сработало как шарм:)
Спасибо!
Чтобы избежать этой ошибки округления числа с плавающей точкой, я бы умножил максимальную точность 10^21 следующим образом
Math.round(1.275*Math.pow(10,21)/Math.pow(10,19))/100 == 1.28
Вот обходной путь для этой проблемы:
Math.round((1.275*100).toFixed(2))/100 // returns 1.28
Объяснение проблемы можно найти в следующих вопросах и ответах.
Математика с плавающей запятой точна только до 52-го двоичного разряда (примерно до 16-го знака после запятой). В то время как 1.275 должен округляться до 1.28, 1.01000110011b == 1.274902d правильно округляется до 1.27.