Подтвердить что ты не робот

Почему 9999999999999999 преобразован в 10000000000000000 в JavaScript?

Может ли кто-нибудь объяснить мне, почему 9999999999999999 преобразован в 10000000000000000?

alert(9999999999999999); //10000000000000000

http://jsfiddle.net/Y2Vb2/

4b9b3361

Ответ 2

Ответ 3

9999999999999999 обрабатывается внутри JavaScript как число с плавающей запятой. Он не может быть точно представлен в двойной точности IEEE 754, так как для этого потребуется 54 бит точности (количество бит - log2 (9999999999999999) = 53,150849512... и поскольку дробные биты не существуют, результат должен быть взят вверх) в то время как IEEE 754 обеспечивает только 53 бит (1 бит имплимента + 52 явно сохраненных бита мантиссы) - на один бит меньше. Следовательно, число просто округляется.

Так как в этом случае теряется только один бит, даже 54-битные числа точно представляются, так как они все же содержат 0 в бит, который теряется. Нечетные 54-битные номера округляются до ближайшего значения, которое является удвоенным даже 53-битным числом, учитывая режим объектива без привязки по умолчанию для IEEE 754.

Ответ 4

Вопрос: Иногда вычисления в JavaScript, похоже, дают "неточные" результаты, например. 0,362 * 100 дает 36,199999999999996. Как я могу избежать этого?

Ответ. Внутренний JavaScript хранит все числа в формате с плавающей запятой с двойной точностью, с 52-битной мантиссой и 11-битным индексом (стандарт IEEE 754 для хранения числовых значений). Это внутреннее представление чисел может вызвать неожиданные результаты, как указано выше. Большинство целых чисел больше 253 = 9007199254740992 не могут быть представлены точно в этом формате. Аналогично, многие десятичные числа/фракции, такие как 0,362, не могут быть представлены точно, что приводит к воспринимаемой "неточности" в приведенном выше примере. Чтобы избежать этих "неточных" результатов, вы можете округлить результаты до точности данных, которые вы использовали.

http://www.javascripter.net/faq/accuracy.htm