Excel的工作表比较运算符是否会产生不一致的结果?

时间:2013-05-10 04:27:09

标签: excel excel-vba floating-point comparison excel-formula vba

请考虑以下事项。将=400000000000000/3放在单元格中,说“A1”。 Excel显示133333333333333.0000。精度是小数点右边的零位数,因为显然,Excel的浮点精度不超过15位。现在将以下公式放在单元格中:

=A1=ROUND(A1,0) 

公式产生True,因为小数点右边没有数字......或者在那里?打开VBA编辑器,在“项目”窗格中右键单击“工作簿”,然后插入VBA模块。定义以下UDF:

Function Equals(dblOne As Double, dblTwo As Double) As Boolean
    Equals = dblOne = dblTwo
End Function

现在返回工作表并将以下公式放在单元格中:

=Equals(A1,ROUND(A1,0))

结果现在是False。为什么呢?

2 个答案:

答案 0 :(得分:3)

Excel的15个精确的十进制数字是威廉卡汉的整个部分的对象essay“浮点数计算中的无效评估是如何无效的?”:

  

15 sig有什么特别之处。十进制?最多显示15 sig。十进制,   正如Excel所做的那样,确保输入的数字最多为15 sig。   dec。,转换为二进制浮点正确舍入到53 sig。   位(这是Excel的算术运行),然后显示   转换回十进制浮点至少正确舍入到圆顶   尽可能多的签名。 (分解)。如果进入但不超过15,将永远   显示与输入的数字完全相同的数字。作出的决定   Excel的算术似乎是十进制而不是二进制限制   Excel的显示最多为15 sig。 dec。因此隐藏了欺骗   足以大大减少Excel的调用次数   技术服务台。当他们感觉到欺骗的症状时   经常被误诊;例如,请参阅David Einstein关于p的专栏。 E2   2005年5月16日和30日的旧金山纪事报。

本节最后总结:

  

这不是列出Excel所需的所有更正的地方。它被引用了   这里仅举例说明设计不存在的错误。

答案 1 :(得分:0)

如果运行以下代码,msgbox会给出两个值的差异。因此它返回false。

   Function Equals(dblOne As Double, dblTwo As Double) As Boolean
        MsgBox dblOne - dblTwo
        Equals = dblOne = dblTwo
    End Function

下面的代码将返回true

Function Equals(dblOne As Double, dblTwo As Double) As Boolean
    Equals = Round(dblOne, 0) = dblTwo
End Function