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).