мне нужно посмотреть в исходном коде светлячок, тем не менее, это интересно попробуйте несколько образцов:
>>> 9.99999999999999999.toString(2)
"1010"
>>> 9.9999999999999999.toString(2)
"1010"
>>> 9.999999999999999.toString(2)
"1001.1111111111111111111111111111111111111111111111111"
>>> 9.999999999999999.toString(2).length
54
>>> 9.99999999999999.toString(2)
"1001.111111111111111111111111111111111111111111111101"
>>> 9.99999999999999.toString(2).length
53
Грубая оценка: около 49 бит входят в мантию, которая оставляет 15 бит для знака и экспонента.
Обновление: я нашел интересную запись в FAQ по comp.lang.javascript, см. http://www.jibbering.com/faq/#FAQ4_7 Он ограничивает точность двойного типа до 53 бит.
Я думаю, что точность исчерпана во время шага, когда он преобразует двойной в 32-битный int до поразрядного логического или операции.
Мне больше интересно узнать, почему этот трюк работает. Не могли бы вы объяснить? – thefourtheye
@ thefourtheye В JavaScript оператор '|' передает все свои аргументы в два подписи, подписанные 32-битными целыми числами. – Oswald
@ Oswald Спасибо :) Я тоже видел нечто похожее, '~~ FloatNumber' – thefourtheye