尝试以两种不同的方式在python 2.7提示符中乘法109221975 * 123222821
Python 2.7.3 (default, Sep 26 2013, 20:08:41)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 109221975*123222821
13458639874691475L
>>> 109221975*123222821.0
1.3458639874691476e+16
>>> int(109221975.0*123222821.0)
13458639874691476L
>>> 109221975*123222821 == int(109221975.0*123222821.0)
False
>>>
我怀疑这里有一些精确的不一致导致了这样的问题,是否有可能推测何时会发生不一致?
答案 0 :(得分:2)
您的int
长54位。 float
可以包含53位有效数字,因此有效地将最后一位数舍入为偶数。
在内部,您的浮动表示为:
2225720309975242 * 2 -1
您的int
和float
存储在二进制文件中,如下所示:
101111110100001000111111001000111001000001000110010011
0 10000110100 0111111010000100011111100100011100100000100011001010
对于float
,第一部分是符号,第二部分是指数,第三部分是有效数字 。因为为指数分配了空间,所以没有足够的空间留下有效数字
我如何对齐两个表示,你可以看到数据是相同的,但int
需要一个额外的数字在右边,而float
使用更多(在这种情况下浪费)空间在左边
答案 1 :(得分:1)
因为python中的int
具有无限精度,但float
没有。 (float
是一个双精度浮点数,具有53位精度。)
答案 2 :(得分:1)
曾几何时,有一个名为st
的字符串想成为一个数字。我应该说几号呢?
该字符串的神仙母亲说:好吧,如果你想成为一个准确的数字,一个用于计算整个事物的数字,我将是一个任意的精度整数:
>>> st='123456789123456789'
>>> int(st)
123456789123456789
>>> int(st)*int(st)*int(st)
1881676377434183981909562699940347954480361860897069
'但我也想算上一些东西,比如我还有的三明治!说圣。因此,公平的教母是一个浮动,但知道你可能会在一段时间后松散跟踪几个1/2三明治。事实上,在9007199254740992
事之后,你可能会开始忘记一些事情,因为当你是一个浮动时你只有53个手指可以计算:
>>> float(int('1'*53,2)+1)
9007199254740992.0
>>> float(int('1'*53,2)+1)+1
9007199254740992.0
>>> int(float(int(st)))
123456789123456784
>>> int(st)-int(float(st))
5