Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python长数数据丢失_Python_Python 3.x_Biginteger_Data Loss - Fatal编程技术网

python长数数据丢失

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

我刚开始学习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 

您使用的是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
),则在使用浮点除法时会出现精度损失。