我只是从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

最佳答案

您使用的是浮点除法,它不能以那么高的精度处理大量数字,之后将结果强制转换回int()来进行累加。

否则,会导致数据丢失。使用integer (floor) division with //代替:

>>> 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


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

关于python - python长数据丢失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16342001/

10-11 00:11