Преобразование строк в несоответствия base36 между языками.

Я заметил некоторые несоответствия между Python и JavaScript при преобразовании строки в base36.

Метод Python:

>>> print int('abcdefghijr', 36)

Результат: 37713647386641447

Метод JavaScript:

<script>
    document.write(parseInt("abcdefghijr", 36));
</script>

Результат: 37713647386641450

Что вызывает разные результаты между двумя языками? Каков наилучший подход для получения одинаковых результатов независимо от языка?

Спасибо.


person Community    schedule 17.10.2012    source источник
comment
См. stackoverflow.com/questions/ 5812096/ ; javascript не имеет больших целых чисел произвольной точности, как это делает Python. (просто набрав 37713647386641447 в консоли javascript, вы получите такое же округленное значение)   -  person Wooble    schedule 17.10.2012


Ответы (1)


Для представления этого числа требуется 56 бит. Числа JavaScript на самом деле являются двоичными числами с плавающей запятой двойной точности, или double для краткости. В целом они 64-битные и могут представлять гораздо более широкий диапазон значений, чем 64-битные целые числа, но из-за того, как они этого достигают (они представляют число как mantissa * 2^exponent), они не могут представлять все числа в этом диапазоне, только те, которые кратны 2^exponent, где кратное соответствует мантиссе (включая 2^0 = 1, поэтому вы получаете все целые числа мантиссы можно обращаться напрямую). Мантисса составляет 53 бита, что недостаточно для этого числа. Таким образом, оно округляется до числа, которое может быть представлено.

Что вы можете сделать, так это использовать произвольный тип числа точности, определенный сторонней библиотекой, такой как gwt-math или Big.js. Эти цифры нетрудно реализовать, если вы знаете школьную арифметику. Сделать это эффективно — это другой вопрос, но также и область обширных исследований. И это не ваша проблема, если вы используете существующую библиотеку.

person Community    schedule 17.10.2012
comment
Отличное объяснение. Спасибо. - person ; 17.10.2012