将字符串转换为base36语言之间的不一致。

时间:2012-10-17 13:50:05

标签: javascript python base36

我注意到在将字符串转换为base36时,Python和JavaScript之间存在一些不一致。

Python方法:

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

结果:37713647386641447

Javascript方法:

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

结果:37713647386641450

导致两种语言之间的不同结果的原因是什么?无论语言如何,产生相同结果的最佳方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:10)

该数字需要56位来表示。 JavaScript的数字实际上是double-precision binary floating point numbers,或简称double。它们总共是64位,并且可以表示比64位整数更宽的范围,但由于它们如何实现(它们代表一个数字mantissa * 2^exponent),它们不能代表该范围内的所有数字,只是2^exponent倍数的数字,其中多重符合尾数(包括2 ^ 0 = 1,所以你得到所有整数尾数可以直接处理)。尾数是53位,不足以满足这个数字。因此它会四舍五入到可以表示的数字。

您可以使用由gwt-mathBig.js等第三方库定义的任意精确数字类型。如果你知道你的学校算术,这些数字并不难实现。有效地做到这一点是另一回事,也是一个广泛研究的领域。如果您使用现有的库,请不要您的问题。