添加时出现有趣的(四舍五入?)错误

Hei*_*all 6 rounding google-sheets

一列包含数字(始终保留 2 位小数,有些是计算得出的,但所有乘法和除法四舍五入到 2 位小数),另一列是累积的。累积列有公式=<above cell>+<left cell>

\n\n

在累积列中,结果是 58.78,第一列中的下一个数字是 -58.78。由于零的格式与正数或负数的格式不同,我发现有些问题。将格式更改为几位小数,数字显示为:

\n\n
                                    \xc2\xa358.780000000000000000000000000000\n-\xc2\xa358.780000000000000000000000000000  \xc2\xa30.000000000000007105427357601000\n
Run Code Online (Sandbox Code Playgroud)\n\n

非零零约为 2^(-47)。另一次,相同情况下的数字是:

\n\n
                                    \xc2\xa350.520000000000000000000000000000\n-\xc2\xa350.520000000000000000000000000000 -\xc2\xa30.000000000000007105427357601000\n
Run Code Online (Sandbox Code Playgroud)\n\n

怎么会这样呢?

\n\n

另外,如果我将累积列中的单元格更改为实际数字 58.78,结果会突然变为零。

\n

小智 5

Google Sheets 使用双精度浮点运算,从而产生了此类伪影。此格式的相对精度为 2^(-53),因此对于 2^6 = 64 左右的数字大小,我们预计截断误差为 2^(-47)。

如果一些电子表格用户发现“58.78”实际上不是 58.78,他们会担心,因为这个数字不承认这种浮点格式的精确表示。因此,电子表格隐藏了真相,对显示的数字进行四舍五入,并在要求更多数字时打印假零。58.78 后面的那些零是假的。

当你减去两个看似相同但实际上并不相同的数字时,真相就会大白于天下——因为它们的计算方式不同,例如一个是求和,另一个是直接输入。将减法结果四舍五入为零就太谎言了:这不再是一个小的相对误差问题,2^(-47) 和 0 之间的差异可能是一个重要的误差。因此,幕后机制的意外揭晓。

另请参阅:为什么 Google 电子表格显示零不等于零?