为什么无论我使用什么 dtype,都要隐式舍入一个数字?

  • 本文关键字:舍入 一个 数字 dtype python
  • 更新时间 :
  • 英文 :


我一直在尝试解决代码中一直损坏的精度问题。我希望值完全按照我提供的方式呈现,但似乎 Python 正在四舍五入该数字。下面是示例。

x = 3069682093880544.81
print (x)
3069682093880545.0
x = Decimal(3069682093880544.81)
print (x)
3069682093880545
x = float(3069682093880544.81)
print(x)
3069682093880545.0
x = Decimal(str(3069682093880544.81))
print(x)
3069682093880545.0
3069682093880545.0
x = str(3069682093880544.81)
print(x)
3069682093880545.0

我想要的只是能够为变量分配确切的值,并且在调用时它为我提供了相同的值。我做错了什么?

根据 IEEE 格式,数字 3069682093880544.81 正在转换为 64 位浮点数。该格式中最接近的数字是43910A47D717A69F.但是,将该数字转换回来将是 3069682093880544.64。如您所见,逗号后的最后 2 位数字已更改。

IEEE 64 位浮点数中的有效位数为 16 位。这可能就是为什么打印输出选择在 16 位数字后停止打印的原因,这很3069682093880545。

如果你想要更多的小数位,你需要选择一个在处理过程中没有IEEE浮点数的方法。(请注意,即使是源代码解释器也将数字解析为浮点格式。正如@LeopardShark所提到的,

from decimal import *
print(Decimal("3069682093880544.81"))

从字符串到十进制,无需任何浮点处理。

问题是文字3069682093880544.81被解析为float。因此,例如,您的第二个语句等同于Decimal(float(3069682093880544.81))。你想要的是Decimal("3069682093880544.81"),它将其解析为字符串,然后将其转换为Decimal

最新更新