在 python 中将指数转换为整数
Converting exponential to integer in python
当我执行此 python 代码时:
integer = 18243150071292141317265306851
print(int(integer / 1))
我收到的输出是:18243150071292140668971909120
不等于 integer
.
为什么会发生这种情况,如何使输出等于 integer
?
该结果可以在 Python3 中实现(或 Python2 并从 future
导入真正的除法),但在库存模式下 Python2 无法实现。
运算符 /
始终生成 "true" 商(带小数部分),但首先它将两个参数转换为其 float
(与 double
相同在 C).这种转换是精度丢失的地方,因为这个 float
只有 53 个有效的二进制数字(猜测你的平台是基于 IEEE754
的,因为 >99% 是)。除以 1 的参数已经以这种方式舍入并等于 18243150071292140668971909120.
(似乎 Python 语言文档在运算符的效果中并不准确。它 notes "The numeric arguments are first converted to a common type" 但忘记了,要获得 float
结果,最简单的方法就是利用平台的浮动划分。)
然后,转换回 int
(准确且基本上无限制)会得到相同的值,您会看到它被打印出来。
要得到你期望的结果,请使用 //
而不是 /
:"floor division" (//
) 不会将其参数转换为 float
. (OTOH,如果其中一些已经是 float
,它可以转换另一个来执行浮点除法并将结果截断为 flooring integer 值。)
这与@PM2Ring 告诉您的基本相同,但形成为答案。
如果你想用比通常 float
提供的更精确的非整数进行计算,你应该摆脱内在类型并考虑使用标准库中的 decimal
, GMP
库 wrapper 或类似的解决方案。
当我执行此 python 代码时:
integer = 18243150071292141317265306851
print(int(integer / 1))
我收到的输出是:18243150071292140668971909120
不等于 integer
.
为什么会发生这种情况,如何使输出等于 integer
?
该结果可以在 Python3 中实现(或 Python2 并从 future
导入真正的除法),但在库存模式下 Python2 无法实现。
运算符 /
始终生成 "true" 商(带小数部分),但首先它将两个参数转换为其 float
(与 double
相同在 C).这种转换是精度丢失的地方,因为这个 float
只有 53 个有效的二进制数字(猜测你的平台是基于 IEEE754
的,因为 >99% 是)。除以 1 的参数已经以这种方式舍入并等于 18243150071292140668971909120.
(似乎 Python 语言文档在运算符的效果中并不准确。它 notes "The numeric arguments are first converted to a common type" 但忘记了,要获得 float
结果,最简单的方法就是利用平台的浮动划分。)
然后,转换回 int
(准确且基本上无限制)会得到相同的值,您会看到它被打印出来。
要得到你期望的结果,请使用 //
而不是 /
:"floor division" (//
) 不会将其参数转换为 float
. (OTOH,如果其中一些已经是 float
,它可以转换另一个来执行浮点除法并将结果截断为 flooring integer 值。)
这与@PM2Ring 告诉您的基本相同,但形成为答案。
如果你想用比通常 float
提供的更精确的非整数进行计算,你应该摆脱内在类型并考虑使用标准库中的 decimal
, GMP
库 wrapper 或类似的解决方案。