Может ли кто-нибудь объяснить мне, почему 9999999999999999 преобразован в 10000000000000000?
alert(9999999999999999); //10000000000000000
Может ли кто-нибудь объяснить мне, почему 9999999999999999 преобразован в 10000000000000000?
alert(9999999999999999); //10000000000000000
Javascript не имеет целых чисел, только 64-битных поплавков - и у вас закончилась точность с плавающей запятой.
См. аналогичную проблему в Java: почему Double.parseDouble делает 9999999999999999 до 10000000000000000?
JavaScript имеет только числа с плавающей запятой, целые числа.
Прочитайте Что должен знать каждый компьютерный ученый о арифметике с плавающей точкой.
Сводка: числа с плавающей запятой включают только ограниченную точность, более 15 цифр (или около того), и вы получите округление.
9999999999999999
обрабатывается внутри JavaScript как число с плавающей запятой. Он не может быть точно представлен в двойной точности IEEE 754, так как для этого потребуется 54 бит точности (количество бит - log2 (9999999999999999) = 53,150849512... и поскольку дробные биты не существуют, результат должен быть взят вверх) в то время как IEEE 754 обеспечивает только 53 бит (1 бит имплимента + 52 явно сохраненных бита мантиссы) - на один бит меньше. Следовательно, число просто округляется.
Так как в этом случае теряется только один бит, даже 54-битные числа точно представляются, так как они все же содержат 0
в бит, который теряется. Нечетные 54-битные номера округляются до ближайшего значения, которое является удвоенным даже 53-битным числом, учитывая режим объектива без привязки по умолчанию для IEEE 754.
Вопрос: Иногда вычисления в JavaScript, похоже, дают "неточные" результаты, например. 0,362 * 100 дает 36,199999999999996. Как я могу избежать этого?
Ответ. Внутренний JavaScript хранит все числа в формате с плавающей запятой с двойной точностью, с 52-битной мантиссой и 11-битным индексом (стандарт IEEE 754 для хранения числовых значений). Это внутреннее представление чисел может вызвать неожиданные результаты, как указано выше. Большинство целых чисел больше 253 = 9007199254740992 не могут быть представлены точно в этом формате. Аналогично, многие десятичные числа/фракции, такие как 0,362, не могут быть представлены точно, что приводит к воспринимаемой "неточности" в приведенном выше примере. Чтобы избежать этих "неточных" результатов, вы можете округлить результаты до точности данных, которые вы использовали.