对于简单的公式,Excel会给出一个False而不是True

我只是偶然发现了一个我从未遇到过的Excel 2013问题。

简而言之,我有一个列(= V为我的特定工作表)返回0或1基于两个精确匹配的数字(即没有舍入错误)。 这是我的工作简单的错误检查。

在单元格F31中,我有= 0.1(手动input)。 在单元格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,这没有任何意义!

如果我input其他值,使Q31不= 0.1,但F31 = Q31,则返回值为0(或Q31 = F31)。 例如,我可以将F31更改为0.2,将L31更改为4.3,使得基于4.5 – 0.0 – 4.3的0.2 = 0.2。 这工作正常。

怎么了0.1?

非常感谢! 埃里克

浮点数是“几乎从不”相等的。 这是由于浮点运算和精度。

并非所有的十进制数都有一个精确的浮点表示。 您手动input的值必须由Excel以最接近的浮点表示法replace。 而且,计算结果的值由处理器的浮点单元取其最接近的值。

比较浮点数时,请使用一些“epsilon”容差。 为你的V31配方使用这样的东西:

 =IF(ABS(Q31-F31) < 1e-10, 0, 1) 

这比较两个数字到十位十进制数字。

为了灵活性,您可以在名称pipe理器中为容差常量“TOL”定义一个“名称”,以便您可以在一个位置更改它,而无需编辑公式。

 =IF(ABS(Q31-F31) < TOL, 0, 1) 

宽容的select取决于您的应用程序。 1e-10在许多情况下是一个不错的select。