当我执行这个python代码时:
integer = 18243150071292141317265306851
print(int(integer / 1))
我收到的输出是:18243150071292140668971909120
,它不等于integer
。
为什么会发生这种情况,如何使输出等于integer
?
答案 0 :(得分:0)
这个结果可以在Python3(或从future
导入真正除法的Python2)中实现,但在库存模式下不是Python2。
运算符/
始终生成“true”商(带小数部分),但首先它将两个参数都转换为float
(与C中的double
相同)。此转换是精度丢失的地方,因为此float
只有53个重要的二进制数字(猜测您的平台基于IEEE754
,因为> 99%是)。除以1的参数已经以这种方式四舍五入,等于18243150071292140668971909120。
(似乎Python语言文档在运算符的效果中并不精确。notes“数字参数首先被转换为公共类型”但忘记了这一点,得到float
结果,利用最简单的方法 - 依靠平台的浮动分区。)
然后,转换回int
(确切且基本上无限制)会给出相同的值,并且您会看到它打印出来。
要获得预期效果,请使用//
代替/
:“底线分区”(//
)不会将其参数转换为float
。 (OTOH,如果其中一些已经float
,它可以转换另一个执行浮动除法,并将结果截断为地板整数值。)
这与@ PM2Ring告诉你的情况基本相同,但形成了答案。
如果你想用精度超过通常float
的非整数数进行计算,你应该摆脱内在类型并考虑使用标准库中的decimal
{ {1}}库wrapper或类似解决方案。