【问题标题】:Wrong code or strange math behavior? (python 3)错误的代码或奇怪的数学行为? (蟒蛇3)
【发布时间】:2014-01-09 21:01:18
【问题描述】:

我通过乘法等来计算变量 我注意到了这种奇怪的行为。

如果我使用这些计算:

CD = 6
CDR = 0.4

CD = float(CD) - (float(CDR) * float(CD))

理论上,如果我打印(CD)它会打印出 6 - (6 * 0.4) = 6 - 2.4 = 3.6

3.5999999999999996

是否有我可以避免的原因?有没有办法,比如 math.ceil 将数字四舍五入但到某个小数,例如到 x.xxxxx(第 5 个十进制)?

(如果我在这篇文章中做错了什么,请告诉我,我在这个网站上找到了一段时间的答案,但以前从未发布过,所以我可能做错了什么,提前道歉。)

【问题讨论】:

标签: python math python-3.x rounding


【解决方案1】:

您可以尝试decimal 模块,但实际上您的答案仍然是“正确的”。这就是浮点数转换为十进制表示的方式。

【讨论】:

  • 请注意,decimal 也是一种浮点格式(只是不是 binary 浮点,并且与 float 不同,它允许任意多位数字),因此也具有圆形-关错误之类的。只是小数的错误与我们人类习惯的错误相匹配,所以更直观一些。
  • @delnan +1 使用Decimal 基本上消除了一类浮点错误。它解决了最常见的问题,即基础转换引入的不准确性。您当然是正确的,尽管它没有考虑在使用数量级显着不同的操作数或单个操作数中的有效数字由多个数量级分隔时执行算术时出现的数量级相关问题。
  • @SilasRay 取决于“基本转换不准确”的确切含义。我假设您指的是最初写为十进制字符串的数字(例如“1.134”),在这种情况下您是对的,尽管我会犹豫将其称为最常见的问题。另一方面,它不能解决不是以十进制字符串形式给出的常量的问题,例如许多比率。例如,出于完全相同的原因,1/3 不能以 2 为底或以 10 为底表示。这是您提到的其他问题的基础。但是,是的,十进制通常更可取。这不是灵丹妙药。
  • @delnan 在比率问题上说得真好,我应该想到这一点。 :)
【解决方案2】:

您遇到了浮点算术问题。尝试使用decimal.Decimal 而不是float

【讨论】:

    【解决方案3】:

    如果它只是为了展示(或头脑)你可以做

    x = math.ceil(x*100000.0) / 100000.0
    

    但是,不能保证 将是一个可以在内存中精确表示的数字(以相同的 3.599999999 结尾..)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 2023-02-16
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多