【问题标题】:Python Decimal Library is Imprecise? [duplicate]Python十进制库不精确? [复制]
【发布时间】:2021-11-11 18:13:10
【问题描述】:

我正在阅读 Python Decimal 模块。我需要进行大量精确的计算,通常有很多小数位,随着时间的推移,少量的偏差会增加。进入十进制库。

第1步:阅读the intro to Decimal library(加粗):

  • 可以精确表示小数。相反,像 1.1 和 2.2 这样的数字在二进制浮点中没有精确的表示。最终用户通常不会期望 1.1 + 2.2 显示为 3.3000000000000003,因为它使用二进制浮点数。

第 2 步:将小数插入 Python。这似乎不精确 - 与浮点计算的差值非常相似。

>>> from decimal import *
>>> 1.1 + 2.2
3.3000000000000003
>>> Decimal(3.3)
Decimal('3.29999999999999982236431605997495353221893310546875')

发生了什么事?

【问题讨论】:

  • 仔细阅读文档。当您将float 对象传递给Decimal 构造函数时,您认为会发生什么?
  • 您可能需要算法来减少精度误差。
  • @Juanpa 谢谢,我意识到我的错误
  • Decimal 格式只能精确计算出十进制结果,即可以表示为十进制数字的结果。如果您超过了它支持或设置的位数,或者如果您执行的任何计算结果无法以十进制数字表示,例如深奥的 1/3,则其精度的行为与其他数字格式一样。

标签: python decimal precision floating-accuracy


【解决方案1】:

Per the documentation:

从整数或浮点数构造执行该整数或浮点数的精确转换。

float字面量3.3的准确值不是3.3 = 33/10,而是二进制近似值3715469692580659 / 250,其准确值为您在屏幕截图中看到的内容。如果这不是您想要的,则将 str 而不是 float 传递给构造函数。

>>> from decimal import *
>>> Decimal(3.3)
Decimal('3.29999999999999982236431605997495353221893310546875')
>>> Decimal('3.3')
Decimal('3.3')

还请记住,虽然 Decimal 精确表示 以十为底 的分数,如 1/10、1/100 或 1/1000,但其他分数是近似的(尽管比 @ 更精确987654328@)。

>>> Decimal(1) / Decimal(3)
Decimal('0.3333333333333333333333333333')
>>> _ * 3
Decimal('0.9999999999999999999999999999')

如果这对您来说是个问题,请使用 Fraction 类而不是 Decimal

>>> from fractions import *
>>> Fraction(1) / Fraction(3)
Fraction(1, 3)
>>> _ * 3
Fraction(1, 1)

【讨论】:

  • 谢谢,这很有帮助。特别是关于分数模块的部分。我没有意识到那是在外面。十进制仍然对我有用。我不需要完美的精度,但我肯定需要的不仅仅是 Float 给我的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 2010-11-08
  • 2015-06-07
  • 1970-01-01
相关资源
最近更新 更多