我偶然发现了一个我从未遇到的Excel 2013问题。
简单地说,我有一个列(=我的特定表单的V),它根据两个完全匹配的数字返回0或1(即没有舍入错误)。这是我工作的简单错误检查。
在单元格F31中,我有= 0.1(手动输入)。在单元格M31,L31和J31中,我分别具有4.5,0.0和4.4。单元格Q31中的公式为 Q31 = M31 - L31 - J31。这是4.5 - 0.0 - 4.4 = 0.1。这些数字都不是来自其他公式。应该没有舍入错误。
现在,在V31栏中,我有If(Q31 = F31,0,1)。毫无疑问,0.1 [F31] = 0.1 [Q31],但V中的返回值为1.这没有任何意义!
如果我输入其他值使Q31不= 0.1但F31 = Q31,则返回值应为0(或Q31 = F31)。例如,我可以将F31更改为0.2,将L31更改为4.3,使得0.2 = 0.2,基于4.5 - 0.0 - 4.3。这很好用。
怎么了0.1?
非常感谢! 埃里克
答案 0 :(得分:1)
浮点数“几乎从不”相等。这是由于浮点运算和精度。
并非所有十进制数都具有精确的浮点表示。您手动输入的值必须由Excel替换为最接近的浮点表示。此外,计算得到的值将被处理器的浮点单元替换为其最接近的值。
比较浮点数时,请使用一些“epsilon”容差。对V31
公式使用类似的内容:
=IF(ABS(Q31-F31) < 1e-10, 0, 1)
将两个数字与第10个十进制数字进行比较。
为了灵活性,您可以在名称管理器中为容差常量“TOL”定义“名称”,这样您就可以在一个地方更改它而无需编辑公式。
=IF(ABS(Q31-F31) < TOL, 0, 1)
容差的选择取决于您的应用。1e-10
在许多情况下是一个不错的选择。