【问题标题】:C++ simple math operations with floats and a wrong result? [duplicate]带有浮点数和错误结果的 C++ 简单数学运算? [复制]
【发布时间】:2014-01-25 19:30:50
【问题描述】:

我需要一些像“3.3 - 2.6”这样的浮点数的简单数学运算。结果是 0.700001。我不知道为什么会有像 0.700001 这样的数字。

Some examples

你能帮帮我吗?

【问题讨论】:

  • “浮动和错误的结果?” - 是的,使用浮点数会得到错误的结果。他们就是这样工作的。但你不能可能 google“C++ 浮点算术错误结果”,对吧?

标签: c++ math subtraction


【解决方案1】:

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • @hyde 也许应该重新命名为What Every Computer Scientist Should READ About Floating-Point Arithmetic。当 oracle 如此糟糕以至于它不得不在其doc 网站上打开 off 开关时,我们无论如何都不会关心。
  • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • @senshin 所以,因为你不会费心阅读一篇关于这篇 very写得非常好(相对较短)的开创性文章话题你嫌我没用勺子喂吗?一个人可以牵一匹马去水等等...
  • @PaulEvans Stack Overflow 上普遍接受的政策是希望答案是独立的,或者至少不完全依赖于外部资源。当然,我同意你的观点,“What Every Computer Scientist...”是一篇精彩的文章,我自己读过它,但与事物的裸链接通常作为 cmets 更好地发挥作用。无论如何,这个问题是可恶的,我已经投票关闭它。
【解决方案2】:

计算机以有限精度处理二进制格式的数字。各种简单的十进制数无法精确表示,因此给出了最接近的答案。

处理该问题的常用方法只是限制您实际显示的精度。如果您使用 C++ 流进行输出,那么 std::fixedstd::setprecision 操纵器应该会有所帮助。

【讨论】:

    【解决方案3】:
    3.3 is represented in memory as 3.29999
    

    2.6 is represented in memory as 2.59998
    

    所以

     3.3 -2.6 = 0.70001
    

    this post 可能会让您对此事有更深入的了解

    【讨论】:

      【解决方案4】:

      这可能是因为浮点精度。尝试使用双精度。

      【讨论】:

      • 其实是因为内存中表示的是十进制数
      • 使用double 而不是float 只会使问题更小,并远离视线。你仍然可以得到奇怪的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多