2012-10-17 37 views
6

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

Python的方法:

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

结果:37713647386641447

JavaScript方法:

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

结果:37713647386641450

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

谢谢。

+4

请参阅http://stackoverflow.com/questions/5812096/javascript-large-integer-round-because-precision-why; javascript没有像Python那样的大整数的任意精度。 (只需在javascript控制台中键入'37713647386641447'会给你相同的取整值) – geoffspear

回答

10

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

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

+0

很好的解释。谢谢。 –

相关问题