2

考虑以下。放在=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。为什么?

4

2 回答 2

3

Excel 的 15 位明显的十进制精度是 William Kahan 的文章“浮点计算中对舍入的无意识评估有多大作用?”的整个部分的对象:

15 sig 有什么特别之处。十二月?最多显示 15 个信号。dec. 与 Excel 一样,确保输入的数字最多为 15 sig。dec.,转换为二进制浮点数,正确舍入为 53 sig。位(这是 Excel 的算术所携带的),然后显示转换回十进制浮点数,正确舍入到至少与 sig 一样多。十二月 输入但不超过 15,将始终显示与输入完全相同的数字。使 Excel 的算术似乎是十进制而不是二进制的决定将 Excel 的显示限制为最多 15 sig。dec.,从而很好地隐藏了欺骗行为,从而大大减少了 Excel 技术服务台的呼叫次数。当察觉到欺骗的症状时,他们通常会被误诊;例如,见大卫爱因斯坦在第 4 页的专栏。

该部分的结尾是:

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

于 2013-05-10T06:58:52.977 回答
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
于 2013-05-10T06:32:40.120 回答