Excel - 为什么此等式检查失败?


1

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

Equality check fails

细胞内容如下:

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

我正在使用Office 16.0.6965.2117。这是一个错误,还是我错过了关于等式运算符如何工作的基本原理?


如果我将A3和A4乘以看似任何值,然后进行相等检查,它就可以了。
rudivonstaden

最好使用= If(A3 = A4,“OK”,“Different”)
yass

该公式也出现了不同 - 等式检查失败
rudivonstaden

2
Excel倾向于舍入数字,如果A1或A2不是文本输入但是公式输入则A3可能是“693.630000001”,excel将看到与“693.63”不同
Kevin Anthony Oppegaard Rose

1
@KevinAnthonyOppegaardRose是正确的。我刚尝试用30位小数改变数字格式,在A3中显示693.629999999999000000000000000000,而A4显示693.6300000000000000000000000000000000
Darius

Answers:


2

因为起始数字比结果大很多,所以你会偶然发现精度损失 IEEE 754浮点 算术。 Excel使用IEEE 754 Double Precision

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

  11474.97 ≙  0  1000000 1100  0110 01101001 01111100 00101000 11110101 11000010 10001111 

......在哪里 0 是标志(正面), 10000001100 是指数,其余是尾数。

 -10781.34 ≙  1  1000000 1100  0101 00001110 10101011 10000101 00011110 10111000 01010010 
    693.63 ≙  0  1000000 1000  0101 10101101 00001010 00111101 01110000 10100011 11010111 

如您所见,大数字恰好具有相同的指数。指数越大,存储的数字就越不精确:

  11474.97 →  11474.9699999999993451638147235
 -10781.34 → -10781.3400000000001455191522837
    693.63 →    693.629999999999995452526491135

正如您已经从对齐的数字中看到的那样,存储693.63的方式更精确。

因此,添加数字的结果是:

 0  1000000 1000  0101 10101101 00001010 00111101 01110000 10100011 11010000 

让我们再比较一下:

 0  1000000 1000  0101 10101101 00001010 00111101 01110000 10100011 11010000  - 结果  0  1000000 1000  0101 10101101 00001010 00111101 01110000 10100011 11010111  - 常数 

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

abs(a - b) < 0.000000001

感谢您添加技术细节。接受这个答案,因为它是如此全面,我认为平等比较的容忍方法可能比简单的舍入更正确。
rudivonstaden

1

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

为了解决这个问题,我将A5更改为读取= ROUND(A3,2)= ROUND(A4,2),这解决了问题所以我只能假设存在一些小问题,其中一小部分小量导致错误。

并且,正如@yass在评论中所说的那样,使用IF语句可以更好地工作并且让事情变得更加适合你,尽管在这种情况下,它并非100%必不可少。


谢谢Stephen。我实际上将它用于条件格式化,因此在这种情况下,IF语句是不必要的。
rudivonstaden
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.