ToFixed (2) раундов "x.525" непоследовательно?
У меня возникают ошибки округления при использовании toFixed:
Я использовал toFixed(2)
для своих вычислений числовых значений, но результаты округления не так ожидаются для нескольких случаев.
Предположим, что для значения 17.525
применяется toFixed(2)
, тогда он дает результат 17.52
, и если он применяется для 5.525
, то он дает результат 5.53
.
В более позднем случае результат округления является точным, поэтому можете ли вы предложить, что нужно сделать, чтобы получить точный результат округления, как в последнем случае. Или вы можете предложить альтернативу этой функции toFixed, чтобы получить правильные результаты округления?
Ответы
Ответ 1
Неточность с плавающей запятой означает, что большинство чисел, заканчивающихся на .525, на самом деле .52500..1, а другие -.5249999.....
Каким образом раунды значений зависят от того, находится ли ближайшее фактическое представление в плавающей точке IEEE-754 выше или ниже желаемого значения.
Ответ 2
Вместо toFixed()
используйте Math.ceil()
, Math.floor()
или Math.round()
таким образом, как
var rnum = 5.525,
decimalPlaces = 2,
factor = Math.pow(10, decimalPlaces),
newnumber = Math.round(rnum * factor) / factor,
mydecimalvalue = parseFloat(newnumber);
результат 5.53
Ответ 3
Преобразовать число в String и работать с ним?
Это последнее средство после того, как я попытался использовать Math.round или смоделировать ближайшее округление с помощью Math.ceil, но не смог. При умножении на 100 некоторое число (например, 17.525) будет немного меньше 100-кратного его значения (1752.5), тогда как другие числа (например, 17.545) будут чуть более чем в 100 раз превышать его значение (1754.5).