【问题标题】:Python Decimal Calculation Is Not PrecisePython 十进制计算不精确
【发布时间】:2021-06-19 10:44:12
【问题描述】:

1 / 9 * 9 的结果应该等于1。然而,Python 返回0.99999999999...

    from decimal import Decimal
    import decimal

    decimal.getcontext().rounding = decimal.ROUND_HALF_UP
    decimal.getcontext().prec = 256

    dec1 = Decimal('1')
    dec9 = Decimal('9')

    dec_result = dec1 / dec9 * dec9
    print(type(dec_result))
    print(dec_result)

我需要一个精确的计算方法,;因此,使用小数与浮点数。

有人可以提出解决办法吗?谢谢...

【问题讨论】:

  • 把除法放在最后:dec1 * dec9 / dec9
  • 这不起作用,因为我无法控制订单。最终用户是。
  • 1/9 不能显示为十进制。使用fraction 而不是decimal
  • 这不是hack,这是标准方式。例如,那个windows计算器,excel,不管做什么。您不需要那么高的精度,您只需要再显示 1 个数字。是的,这是不精确的。是的,对于特定的用例,还有其他方式来表示暗示其他妥协的数字。但是由于您没有提到用例……
  • @spectras 我建议在答案中比您需要的精度高一些,如果在显示答案之前进行大量计算,您可能会累加很多舍入误差,这就是为什么浮点单元使用 80 位精度,但双精度仅存储 64 位

标签: python decimal calculation


【解决方案1】:

解释为什么会这样: 这不是 python 的十进制模块的进动错误。
许多计算机和许多其他编程语言的行为方式相同。拿一个旧计算器,将 1 除以 9,然后再乘以 9。你会得到从 python 得到的 0.9999999。
作为人类,我们可以通过简化分数1 * 9 / 9 = 1 来确定确切的结果等于一。但是很多数字计算机通过逐个元素来计算运算,基本上将运算分解为更小的运算。所以对于一台计算机,1 / 9 * 9 将是这样的:计算 1 除以 9。将结果乘以 9。如果你手工计算,一个一个地执行每个子操作,你会得到相同的结果。

但是:尽管从我的角度来看,0.9999999 的结果非常准确,许多现代计算器和许多现代编程语言,例如 PythonJSJavaC++ 甚至 C 都使用它们的原始数据类型来处理这个问题。这意味着如果您使用这些编程语言的原始数据类型doublefloat,则无需担心此类进动问题。我测试了 JSPython 并得到了相似的结果。

Python 3.8  
>>> a = 1.0  
>>> b = 9.0  
>>> a / b * b  
1.0

【讨论】:

  • Mac OS 和 Windows 计算器都可以做到这一点。换句话说,1/9*9=1 是显示的结果。试试看:)
  • @BurcakAkiska> 不,他们没有。他们只是在显示结果时对结果进行四舍五入。
  • 那是因为他们可能使用更新的数据结构来计算操作。可能是考虑到数据的限制。虽然 Actual 结果必须是 0.999999(计算机方面)。
  • 我从未声称这是一个错误。这只是破坏了我的部分解决方案的情况。我使用 Decimal 而不是 Float 的全部原因是在计算中引入了大量的不一致。例如 float_add = 0.1 + 0.1 + 0.1 给出 0.30000000000000004 作为结果。不过会检查 numpy 的 Double ......谢谢。
【解决方案2】:

似乎准确性问题出在 Decimal 模块本身

正常做这个操作

1/9 * 9

会给我们结果为 1.0

我建议你自己去正规部门

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 2012-12-28
    • 2011-12-20
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    相关资源
    最近更新 更多