2013-03-14 4 views
1

Я хочу округлить число до двух десятичных знаков в javascript. Я нашел много сообщений о том, что поведение SO .toFixed непредсказуемо для разных браузеров.Круглые до двух знаков после запятой, javascript

И нашел это решение во многих местах, которые принимаются без исключения

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 ????

+0

@ scott.korin - Человек !! Я думаю, ты это сделал. (Пожалуйста, проверьте мою часть редактирования) '1.275 * 10 * 10' возвращает правильный результат' 127.5', в то время как '1.275 * 100' не вернул правильный результат. Большое спасибо!! –

ответ

1

Согласно @ scott.korin комментарий изменен

Math.round(1.27532423 * 100)/100 

в

Math.round(1.27532423 * 10 * 10)/100 // changed 100 to 10*10 

и он работал как шарм :)

Спасибо!

0

Математика с плавающей точкой является точной только для 52nd binary place (примерно 16-й десятичной). В то время как 1.275 должен округлить до 1.28, 1.01000110011b == 1.274902d правильно округляется до 1.27.

+0

Спасибо! Но я не хочу углубляться в математику :) Но просто хочу знать, есть ли какая-либо функция, которая всегда может вернуть мне правильный результат. –

+0

В математике с плавающей запятой правильный результат равен 1.27. –

+0

Но что должно получиться 1.275, как правило, 1.27 или 1.28? Я имею в виду для расчета –

0

Вот обходной путь для этой проблемы:

Math.round((1.275*100).toFixed(2))/100 // returns 1.28 

Объяснения проблемы можно найти в следующих Q&A

0

Чтобы избежать этого числа с плавающей точкой округления ошибки, я бы умножить максимальную точность 10^21 вроде после

Math.round(1.275*Math.pow(10,21)/Math.pow(10,19))/100 == 1.28 
Смежные вопросы