Excel - 为什么这个平等检查失败了?

Excel - 为什么这个平等检查失败了?

我正在使用 Excel 检查导入的银行对账单。我使用的测试之一是确保余额列等于之前的余额加上行金额。到目前为止,在所有情况下它都有效,但对于这组特定的值,它似乎失败了:

平等检查失败

单元格内容如下:

A1: 11474.97
A2: -10781.34
A3: =A1+A2
A4: 693.63
A5: =A3=A4

我正在使用 Office 16.0.6965.2117。这是一个错误,还是我错过了有关相等运算符工作原理的一些基本知识?

答案1

由于起始数字比结果大很多,因此你可能会遇到精度损失,原因是IEEE 754 浮点算术。Excel 使用 IEEE 754 双精度

我不会深入探讨细节,而是说明这个问题。首先,让我们将所有数字转换为 IEEE 754:

  11474.97 ≙01000000 11000110 01101001 01111100 00101000 11110101 11000010 10001111

... 在哪里0是符号(正),10000001100是指数,其余是尾数。

-10781.34 ≙11000000 11000101 00001110 10101011 10000101 00011110 10111000 01010010
    693.63 ≙01000000 10000101 10101101 00001010 00111101 01110000 10100011 11010111

可以看出,大数恰好具有相同的指数。指数越大,存储的数字越不精确:

  11474.97 → 11474.9699999999993451638147235
-10781.34 → -10781.3400000000001455191522837
    693.63 → 693.62999999999995452526491135

从对齐的数字中您已经可以看到,693.63 的存储方式更加精确。

因此,将这些数字相加的结果是:

01000000 10000101 10101101 00001010 00111101 01110000 10100011 11010000

我们再比较一下:

01000000 10000101 10101101 00001010 00111101 01110000 10100011 11010000 – 结果
01000000 10000101 10101101 00001010 00111101 01110000 10100011 11010111 – 常数

所以,不太一样。您应该始终将浮点数与容差进行比较。像这样:

abs(a - b) < 0.000000001

答案2

我不知道为什么会这样,但我正在使用 Office 2010 并遇到了同样的问题。

为了解决这个问题,我将 A5 改为 =ROUND(A3, 2)=ROUND(A4, 2),这样就解决了问题,所以我只能假设某个地方的微小金额的分数存在某种小问题导致了错误。

而且,正如 @yass 在评论中所说,使用 IF 语句会更好用,并且会让事情变得更整洁,尽管在这种情况下,它并不是 100% 必要的。

相关内容