python长数数据丢失
我刚开始学习python(python3),因为我读到它对euler项目有好处,因为它可以处理非常大的数字 现在,我正在努力解决一个非常简单的问题:将float转换为int。为什么我不能得到相同的结果呢python长数数据丢失,python,python-3.x,biginteger,data-loss,Python,Python 3.x,Biginteger,Data Loss,我刚开始学习python(python3),因为我读到它对euler项目有好处,因为它可以处理非常大的数字 现在,我正在努力解决一个非常简单的问题:将float转换为int。为什么我不能得到相同的结果呢 num = 6008514751432349174082765599289028910605977570 print('num {0} '.format(int(num))) num = num / 2 print('num /2 {0} '.format(int(num)))
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
您使用的是float division,它不能以同样高的精度处理大的数字,然后通过将结果转换回
int()
不要这样做,否则会导致数据丢失。改用:
当然,如果输入值不能被2整除,这仍然会导致舍入错误:
>>> 6008514751432349174082765599289028910605977571 // 2 * 2
6008514751432349174082765599289028910605977570
但是浮点值的精度是有限的,这取决于您对CPU的精确支持;查看平台对浮点数施加的确切限制
在我的Mac电脑上,sys.float\u info.dig
告诉我,我的平台支持15位精度,但你正在除以46位整数。这意味着您在使用浮点除法时,会从大整数中去掉底部30位数字:
>>> len(str(int(6008514751432349174082765599289028910605977570 / 2) - (6008514751432349174082765599289028910605977570 // 2)))
30
这是一个很大的精度损失。:-) 您使用的是浮点除法,它无法以同样高的精度处理大的数字,之后您将通过将结果转换回int()
来确定结果
不要这样做,否则会导致数据丢失。改用:
当然,如果输入值不能被2整除,这仍然会导致舍入错误:
>>> 6008514751432349174082765599289028910605977571 // 2 * 2
6008514751432349174082765599289028910605977570
但是浮点值的精度是有限的,这取决于您对CPU的精确支持;查看平台对浮点数施加的确切限制
在我的Mac电脑上,sys.float\u info.dig
告诉我,我的平台支持15位精度,但你正在除以46位整数。这意味着您在使用浮点除法时,会从大整数中去掉底部30位数字:
>>> len(str(int(6008514751432349174082765599289028910605977570 / 2) - (6008514751432349174082765599289028910605977570 // 2)))
30
这是一个很大的精度损失。:-) @MartijnPieters何时有人使用/
而不是/
?@dustin:当您想应用整数除法(因此结果是int
)而不是浮点值时。@dustin:当您处理的整数值的位数超过平台所能支持的位数时(请参见sys.float\u info.dig
)然后,当您使用浮点除法时,您将看到精度损失。@MartijnPieters何时有人使用/
而不是/
?@dustin:当您要应用整数除法时(因此结果是int
)而不是浮点值。@dustin:当您处理的整数值的位数超过您的平台所能支持的位数时(请参见sys.float\u info.dig
),则在使用浮点除法时会出现精度损失。