请考虑以下内容。将=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
。为什么?
发布于 2013-05-10 06:58:53
Excel的15个明显的精度小数位数是威廉·卡汉的essay“浮点计算中的舍入的盲目评估是多么无用?”的整整一节的目标:
15sig有什么特别之处?十二月份?最多显示15sig。与Excel一样,确保输入的数字最多具有15个符号。12月,转换为二进制浮点数,正确舍入为53符号。位(这是Excel的算术携带的),然后显示转换回十进制浮点,正确四舍五入到至少同样多的sig。12月。如果输入的数字不超过15,将始终显示与输入的数字完全相同的数字。使Excel的算术看起来像十进制而不是二进制的决定将Excel的显示限制为最多15sig。12月,从而很好地隐藏了欺骗,从而大大减少了对Excel技术帮助台的呼叫次数。当察觉到欺骗的症状时,它们通常会被误诊;例如,请参阅大卫·爱因斯坦在2005年5月16日和30日在旧金山纪事报E2页上的专栏。
这一节的结尾是:
这不是列出所有需要的更正的地方。这里引用它只是为了举例说明设计为不能被发现的错误。
发布于 2013-05-10 06:32:40
如果你运行下面的代码,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
https://stackoverflow.com/questions/16475192
复制相似问题