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