Python 中大整数/数字的浮点数到 Int 类型的转换

Float to Int type conversion in Python for large integers/numbers

提问人:Siddhant Agarwal 提问时间:5/20/2022 最后编辑:Goku - stands with PalestineSiddhant Agarwal 更新时间:6/20/2023 访问量:298

问:

在我正在处理的以下代码上需要一些帮助。为什么“a”中的原始数字在进行类型转换时与“c”不同。有什么方法可以使“a”和“c”在通过float ->int类型转换时相同?

a = '46700000000987654321'
b = float(a)  => 4.670000000098765e+19
c = int(b)    => 46700000000987652096
a == c        => False
python-3.x 浮点 类型转换 精度

评论

0赞 Tim Roberts 6/20/2023
你需要考虑你为什么要这样做。如果你需要做算术,那么也许你应该把它保留为整数。下面建议的 Decimal 类型比 int 算术或浮点算术慢得多。另一方面,在现实世界中,您需要保留超过 16 位数字的预视是非常非常罕见的。

答:

1赞 Goku - stands with Palestine 5/20/2022 #1

请阅读以下关于浮点运算的文档:问题和限制:

https://docs.python.org/3/tutorial/floatingpoint.html

举个例子:

from decimal import Decimal
a='46700000000987654321'

b=Decimal(a)

print(b)    #46700000000987654321

c=int(b)

print(c)    #46700000000987654321
3赞 ShadowRanger 1/26/2023 #2

我对另一个问题的回答的修改版本(合理地)欺骗了这个问题:

发生这种情况是因为大于 C 的整数表示限制(这是 Python 的实现方式)。46700000000987654321doublefloat

通常,C 是 IEEE 754 64 位二进制浮点值,这意味着它们具有 53 位整数精度(最后一个连续的整数值可以表示,后跟 ;它不能表示)。问题是,需要 66 位整数精度来存储(将提供此信息)。当一个值对于单独使用有效数(整数分量)来说太大时,浮点值的指数分量用于将较小的整数值缩放为 2 的幂,使其大致在原始值的大致范围内,但这意味着可表示的整数开始跳跃,首先是 2(因为您需要 >53 位), 然后是 4(对于 >54 位),然后是 8(>55 位),然后是 16(>56 位),依此类推,对于超过 53 位的每个额外幅度位,在可表示值之间跳过两倍的距离。doublefloat2 ** 53 - 12 ** 532 ** 53 + 146700000000987654321(46700000000987654321).bit_length()

在您的例子中,转换为 的整数值为(如您所指出的),在低位数中失去了精度。46700000000987654321float46700000000987652096

如果您需要任意精确的以 10 为基数的浮点数学运算,请将 替换为 decimal。十进制(方便的是,您的初始值已经是一个字符串,因此您不会冒着在键入 a 的方式和存储的实际值之间失去精度的风险);默认精度将处理这些值,如果需要更大的值,可以增加它。如果这样做(并转换为 an 进行比较,因为 a 永远不会等于任何数值类型),则会得到预期的行为:floatfloataintstr

from decimal import Decimal as Dec, getcontext

a = "46700000000987654321"
b = Dec(a); print(b)  # => 46700000000987654321
c = int(b); print(c)  # => 46700000000987654321
print(int(a) == c)    # => True

在线试用!

如果你在交互式解释器中回显 s 而不是使用 ,你会看到 s,这是 s 的形式,但它是数字的,如果转换为 ,或者通过任何不使用 的方法字符串化,例如 ,它显示为 .DecimalprintDecimal('46700000000987654321')reprDecimal46700000000987654321intreprprint46700000000987654321