比较VBA中的精度问题

我无法在Excel VBA中比较两个double

假设我有以下代码

Dim a as double Dim b as double a = 0.15 b = 0.01 

在对b进行一些操作之后,b现在等于0.6

然而,与双数据types相关的不精确性让我头痛,因为

 if a = b then //this will never trigger end if 

你知道我怎样才能消除双重types的拖尾不精确?

您无法比较浮点值是否相等。 有关如何处理内在错误的讨论,请参见本文“ 比较浮点数 ”。

除非你确切知道浮点数的绝对范围是否在预先确定的范围内,否则它并不像一个恒定的误差范围那么简单。

双打比较平等是不明智的。

一些十进制值映射到几个浮点表示。 所以一个0.6并不总是等于另一个0.6。

如果我们从另一个中减去一个,我们可能得到类似于0.00000000051的东西。

现在我们可以将平等定义为具有小于某个误差范围的差异。

如果你打算这样做….

 Dim a as double Dim b as double a = 0.15 b = 0.01 

你需要像这样在你的IF语句中添加循环函数…

  If Round(a,2) = Round(b,2) Then //code inside block will now trigger. End If 

另请参阅此处以获取其他Microsoft参考 。

这是我写的一个简单的函数:

 Function dblCheckTheSame(number1 As Double, number2 As Double, Optional Digits As Integer = 12) As Boolean If (number1 - number2) ^ 2 < (10 ^ -Digits) ^ 2 Then dblCheckTheSame = True Else dblCheckTheSame = False End If End Function 

调用它:

 MsgBox dblCheckTheSame(1.2345, 1.23456789) MsgBox dblCheckTheSame(1.2345, 1.23456789, 4) MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002) MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002, 14) 

正如已经指出的那样,许多十进制数不能精确表示为传统的浮点types。 根据问题空间的性质,最好使用十进制VBAtypes,它可以表示十进制数字(基数为10),其精度可以达到一定的小数点。 这通常是代表金钱,例如在2位十进制精度通常是需要的。

 Dim a as Decimal Dim b as Decimal a = 0.15 b = 0.01 

货币数据types可能是一个很好的select。 它处理相对较大的数字,具有固定的四位数精度。