【问题标题】:WRONG SUM OF DOUBLES IN VB .NET [duplicate]VB .NET 中的错误总和 [重复]
【发布时间】:2014-08-18 12:14:50
【问题描述】:

您好,我正在使用 Microsoft VB 2012,但在使用双精度数时遇到问题。

这个简单的代码重现了它:

Dim result As Double = 0
Dim amount1 As Double = 81.83
Dim amount2 As Double = 50.0
result += amount1
result += amount2

结果等于 131.82999999998 而不是 131.83

事实上:

Dim test1 As Double = 81.83 + 50.0   '(= 131.82999999998 wrong)
Dim test2 As Double = 81.83 + 50     '(= 131.82999999998 wrong)
Dim test3 As Double = 81.83 + 10     '(=  91.83 OK)
Dim test4 As Double = 81.82 + 50.0   '(=  131.82 OK)

谁能解释一下?

最好的问候 大卫

【问题讨论】:

标签: .net vb.net sum


【解决方案1】:

双精度值只能精确表示某些数字。大多数值只能近似。 See Wikipedia for some more detailed explanation. 您基本上具有固定数量的十进制数字,具体取决于浮点数的大小(比较 Single 和 Double)和表示数字的指数。因此,即使是简单的计算也可能会产生一些舍入误差。

为避免这种情况,您可以使用Decimal 之类的数据类型,该数据类型可以精确表示并且通常用于财务计算,例如以避免这些错误。

【讨论】:

  • 双精度值精确的。它与开始时提供的十进制表示不完全相同。 Decimal 值是否“不精确”,仅仅因为它不能精确地表示 1/3?
  • 你可能是对的语义。但同时对他来说重要的是,大量使用 Single 或 Double 类型的浮点计算会导致舍入错误,而这通常可以通过使用 Decimal 来避免。
  • 这很好,是的 - 那么为什么要以不正确的陈述开始呢?了解浮点类型表示精确值很重要,只是一组不同的精确值。
  • 我在写作时对我的句子的理解有所不同,但我发现在您指出后它并不正确,并且可能会导致混淆。我改了。
  • 更好 - 但是说你有一个固定数量的 decimal 数字有点没抓住重点。有一个固定数量的 binary 数字和一个指数。问题不在于“简单的计算可​​能会产生一些舍入错误”——Decimal 也是如此——问题在于无法准确表示十进制值(例如问题中的 81.83)。请参阅csharpindepth.com/Articles/General/FloatingPoint.aspx 了解我对此的描述。
猜你喜欢
  • 1970-01-01
  • 2020-12-18
  • 2017-09-02
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多