提问人:Siddhant Agarwal 提问时间:5/20/2022 最后编辑:Goku - stands with PalestineSiddhant Agarwal 更新时间:6/20/2023 访问量:298
Python 中大整数/数字的浮点数到 Int 类型的转换
Float to Int type conversion in Python for large integers/numbers
问:
在我正在处理的以下代码上需要一些帮助。为什么“a”中的原始数字在进行类型转换时与“c”不同。有什么方法可以使“a”和“c”在通过float ->int类型转换时相同?
a = '46700000000987654321'
b = float(a) => 4.670000000098765e+19
c = int(b) => 46700000000987652096
a == c => False
答:
请阅读以下关于浮点运算的文档:问题和限制:
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
我对另一个问题的回答的修改版本(合理地)欺骗了这个问题:
发生这种情况是因为大于 C 的整数表示限制(这是 Python 的实现方式)。46700000000987654321
double
float
通常,C 是 IEEE 754 64 位二进制浮点值,这意味着它们具有 53 位整数精度(最后一个连续的整数值可以表示,后跟 ;它不能表示)。问题是,需要 66 位整数精度来存储(将提供此信息)。当一个值对于单独使用有效数(整数分量)来说太大时,浮点值的指数分量用于将较小的整数值缩放为 2 的幂,使其大致在原始值的大致范围内,但这意味着可表示的整数开始跳跃,首先是 2(因为您需要 >53 位), 然后是 4(对于 >54 位),然后是 8(>55 位),然后是 16(>56 位),依此类推,对于超过 53 位的每个额外幅度位,在可表示值之间跳过两倍的距离。double
float
2 ** 53 - 1
2 ** 53
2 ** 53 + 1
46700000000987654321
(46700000000987654321).bit_length()
在您的例子中,转换为 的整数值为(如您所指出的),在低位数中失去了精度。46700000000987654321
float
46700000000987652096
如果您需要任意精确的以 10 为基数的浮点数学运算,请将 替换为 decimal。十进制(
方便的是,您的初始值已经是一个字符串,因此您不会冒着在键入 a 的方式和存储的实际值之间失去精度的风险);默认精度将处理这些值,如果需要更大的值,可以增加它。如果这样做(并转换为 an 进行比较,因为 a 永远不会等于任何数值类型),则会得到预期的行为:float
float
a
int
str
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 的形式,但它是数字的,如果转换为 ,或者通过任何不使用 的方法字符串化,例如 ,它显示为 .Decimal
print
Decimal('46700000000987654321')
repr
Decimal
46700000000987654321
int
repr
print
46700000000987654321
评论