【问题标题】:What Should be the result of 128.01+0.01 in C# [duplicate]C#中128.01+0.01的结果应该是什么[重复]
【发布时间】:2011-06-29 03:48:20
【问题描述】:

可能的重复:
Precision of Floating Point
Floating point arithmetic is too reliable.

大家好,

我遇到了一个看起来很奇怪的问题,我正在以 0.01 的步长运行从 82.01 到 169.06 的循环,但是当我达到 128.01 并执行 (128.01+0.01) 时,它会给出 128.019999999998 而不是 128.02。 我对所有这些计算都使用双精度。如果我使用小数来进行这些计算,效果很好,我是否在这里缺少一个非常基本的基础,我在网上找到了一些文章和讨论,解释说小数是执行这些操作的正确数据类型计算,但仍然像 (128.01+0.01) 这样的基本计算应该给出正确的结果。

【问题讨论】:

  • 那你期望太高了。
  • 几分钟前刚刚被问及回答的完全相同的问题:stackoverflow.com/questions/5029955/…下次请先使用搜索。
  • 这是意料之中的(给定一个有效的表达式)。并非所有浮点数都可以用二进制精确表示,因此计算中会出现舍入误差。 decimaldouble 将得到不同的舍入误差,因为它们的位表示不同。这也是一个重复的问题。
  • 请参阅floating-point-gui.de 以获得很好的解释。

标签: c# .net math double decimal


【解决方案1】:

浮点计算本质上是不准确的,因此,这种行为是完全正常的。如果您真的需要更高的精度,请坚持使用小数,但请记住它们的方式,方式比浮点数/双精度数慢。通常,最好只接受不准确之处并根据需要进行四舍五入。

【讨论】:

  • 它们也可能不准确——只是值不同。
【解决方案2】:
猜你喜欢
  • 2014-01-13
  • 1970-01-01
  • 2014-07-25
  • 2015-12-23
  • 2011-02-12
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多