0

Я попытался это выражение как в моем FireFox и Chrome консоли:JavaScript умножение арифметика

17.99 * 100; 

Ожидаемый результат: 1799

Фактический результат: 1798,9999999999998

Я также попытался:

parseInt(17.99 * 100); 

Ожидаемый результат: 1799

Фактический результат: 1798

Почему это происходит, и как я могу получить ожидаемый результат?

ответ

1

Арифметика с плавающей точкой - не точная наука. Причина в том, что в памяти ваша точность хранится в двоичном (все полномочия двух). Если он не может быть представлен точной мощностью в два, вы можете получить некоторую потерю точности.

Ваш номер, 1798.9999999999998 имел достаточно упущенную точность, что он не округлялся при умножении.

http://en.wikipedia.org/wiki/IEEE_floating_point

0

Попробуйте это:

Math.round(17.99*100) 

Как пояснил предыдущий ответ, умножая число с плавающей точкой не является точной наукой; вы можете ожидать результата в определенном диапазоне точности. Посмотрите на Number.prototype.toPrecision().

(17.99*100).toPrecision(4) 
+2

не будет работать для всех операций с плавающей запятой – 999k

+1

@ 555k вы должны дать пример, когда и почему этого не будут работать. –

+0

@DrewDahlman Try Math.round (17.656 * 100) – 999k

Смежные вопросы