Excel的工作表比较运算符是否给出不一致的结果?

考虑以下。 在一个单元格中放置=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 。 为什么?

Excel的十五个精确的十进制数字是威廉·卡汉(William Kahan)的论文 “在浮点运算中四舍五入的评估是多么徒劳无功”的整个部分的对象:

关于15 sig的特别之处 十进制? 最多显示15个sig。 如Excel所做的那样,确保input最多15个字符的数字。 十进制,转换为二进制浮点正确舍入到53 sig。 位(这是Excel的算术运算),然后显示转换回十进制浮点正确舍入到至less一样多的信号。 (分解)。 如input但不超过15,将始终显示完全相同的数字input。 决定让Excel的算术似乎是十进制,而不是二进制限制Excel的显示至多15 sig。 因此很好地隐藏了欺骗,大大减less了Excel技术服务台上的呼叫次数。 当看到欺骗的症状时,他们经常被误诊; 例如见戴维·爱因斯坦(David Einstein)的专栏。 “旧金山纪事报”E2版2005年5月16日至30日。

本节的结尾是:

这是没有地方列出Excel需要的所有更正。 这里引用它只是为了举例说明错误不能被发现。

如果你运行下面的代码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