Ответ 1
От Руководство по плавающей запятой:
Почему не мои цифры, например, 0,1 + 0,2, составляют хороший раунд 0,3 и вместо этого я получаю странный результат вроде 0,30000000000000004?
Поскольку внутренне компьютеры используют формат (двоичный с плавающей запятой), который не может точно представлять число например 0,1, 0,2 или 0,3.
Когда код скомпилирован или интерпретируется, ваш "0,1" уже округленное до ближайшего формате, что приводит к небольшому ошибки округления еще до происходит расчет.
В вашем случае ошибки округления происходят, когда введенные значения преобразуются с помощью parseFloat()
.
Почему другие вычисления, такие как 0.1 + 0.4, работают правильно?
В этом случае результатом (0.5) может быть как точно число с плавающей запятой и возможны ошибки округления в номера ввода для отмены друг друга - Но на эту возможность нельзя полагаться (например, когда эти два числа были хранятся в плавающих первых, ошибки округления могут не другой).
В других случаях, таких как 0,1 + 0,3, результат на самом деле не совсем 0,4, но достаточно близко, чтобы 0,4 был самым коротким число, которое ближе к результату чем к любой другой плавающей точке номер. Затем отображаются многие языки это число вместо преобразования фактический результат вернуться к ближайшему десятичная дробь.