Округлить до двух десятичных знаков, 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.

Другие вопросы по тегам