excel - 比较两个双打是否相等失败
问题描述
这很奇怪,而且我没有显示它的最小示例,因为它位于一大段代码的中间,我无法在示例代码中复制它。
我有一个 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
条件并且代码停止。
知道为什么会发生这种情况吗?
解决方案
问题
这里的问题具有技术数学性质。计算机不能真正进行代数计算,而是以定义的精度进行数值计算。这意味着结果在数学上可能不正确,但非常接近正确。
因此,您无法比较浮点值是否相等。
计算机中的值不是 100% 精确的。它们仅精确到特定数量的数字。例如:
Number Value
0.1 0.1 (of course)
float(.1) 0.100000001490116119384765625
double(.1) 0.1000000000000000055511151231257827021181583404541015625
阅读比较浮点数或浮点运算可能会在 Excel 中给出不准确的结果,了解更多背景信息以及如何正确处理。
解决方案 1
因此,If TBC = temp_g Then
如果它们的差异小于10⁻ⁿ
满足您认为这两个相等的精度标准的“小数”,而不是测试相等性测试。
例如,您可以使用以下内容(其中n
是您需要将精度视为相等的位数):
If (TBC - temp_g) ^ 2 < (10 ^ -n) ^ 2 Then
请注意,我们需要将两边平方以确保没有负面结果。
解决方案 2
或者,您可以将两个值四舍五入到特定数量的数字以测试是否相等。
If Round(TBC, 5) = Round(temp_g, 5) Then
如果它们的前 5 位数字相同,这将被视为TBC
相等。temp_g
推荐阅读
- testing - 我如何安装 Spectron 并开始编写脚本?
- maven - 没有 settings.xml 的声纳 Maven 插件
- facebook - 如何在 facebook 分析服务器到服务器中处理用户
- javascript - 如何将 jQuery UI 所有选定范围(不仅是最小值和最大值)加载到数组中
- azure - Hive Table 迁移到不同的环境
- ruby-on-rails - 如何根据参数验证 Rails 模型?
- ssh - 快照恢复后,Google Cloud VM 上的连接被拒绝
- linux - 如果未评估条件以向用户显示帮助信息,则为 Shell 脚本
- python - “DbgCommand()”也能得到超链接的结果吗?
- ag-grid - 仅过滤,不输入文本或数字