这很奇怪,我没有一个最小的示例显示它,因为它位于大量代码的中间,并且我无法在示例代码中复制它。
我有一个if语句:
Dim TBC as Double: TBC = 0.10625
Dim temp_g As Double: temp_g = Vol * USVol
If TBC = temp_g Then
ContinueCalculation = False
ElseIf TBC > temp_g Then
Stop 'you have an error.
End If
Vol
和USVol
是全局定义的变体。 Vol = 0.125
。 USVol = 0.85
。
0.85 * 0.125 = 0.10625
我希望TBC = temp_g
if语句会触发,并且会触发ContinueCalculation = False
语句。相反,代码达到了TBC > temp_g
条件,代码停止了。
知道为什么会这样吗?
答案 0 :(得分:0)
这里的问题是技术性的。计算机不能真正执行代数计算,而是可以以定义的精度执行数值计算。这意味着结果在数学上可能不正确,但相当接近正确。
因此,您无法比较浮点值是否相等。
计算机中的值不是100%精确的。它们仅精确到特定位数。例如:
Number Value
0.1 0.1 (of course)
float(.1) 0.100000001490116119384765625
double(.1) 0.1000000000000000055511151231257827021181583404541015625
阅读Comparing floating point numbers或Floating-point arithmetic may give inaccurate results in Excel了解更多背景信息以及如何正确处理这些信息。
因此,不是测试相等性If TBC = temp_g Then
,而是检查它们的差是否小于满足您为使这两个相等而制定的精确度标准的“小数” 10⁻ⁿ
。
例如,您可以使用以下内容(其中n
是精确到等于数字所需的位数):
If (TBC - temp_g) ^ 2 < (10 ^ -n) ^ 2 Then
请注意,我们需要将两边均等以确保没有负面结果。
或者,您也可以将两个值四舍五入到特定位数以测试是否相等。
If Round(TBC, 5) = Round(temp_g, 5) Then
如果前5位数字相同,这将认为TBC
等于temp_g
。