1

我刚从 python (python3) 开始,因为我读到它对 euler 项目有好处,因为它可以处理非常大的数字。

现在我正在努力解决将float转换为int的一个非常简单的问题。为什么我不能得到相同的结果:

num =  6008514751432349174082765599289028910605977570

print('num     {0} '.format(int(num)))

num = num / 2
print('num /2  {0} '.format(int(num)))

num = num * 2
print('num *2  {0} '.format(int(num)))

为此的输出是:

num     6008514751432349174082765599289028910605977570 
num /2  3004257375716174771611310192874715313222975488 
num *2  6008514751432349543222620385749430626445950976 
4

1 回答 1

7

您正在使用浮点除法,它无法以同样高的精度处理大量数字,之后您通过将结果转换回int().

不要这样做,这会导致数据丢失。改为使用整数(下限)除法//

>>> 6008514751432349174082765599289028910605977570 // 2 * 2
6008514751432349174082765599289028910605977570

当然,这仍然会导致舍入错误,如果输入值不能被 2 整除而没有下限:

>>> 6008514751432349174082765599289028910605977571 // 2 * 2
6008514751432349174082765599289028910605977570

但是根据您的确切 CPU 支持,浮点值的精度会受到限制;查看sys.float_info您的平台对浮点数施加的确切限制。

在我的 Mac 上,sys.float_info.dig告诉我我的平台支持 15 位精度,但您正在划分一个 46 位整数。这意味着您在使用浮点除法时会丢弃大整数中的后30位数字:

>>> len(str(int(6008514751432349174082765599289028910605977570 / 2) - (6008514751432349174082765599289028910605977570 // 2)))
30

那里有很多精度损失。:-)

于 2013-05-02T15:34:56.123 回答