Google 表格比 Microsoft Excel 更准确还是更准确?

Is Google Sheets less or more accurate than Microsoft Excel?

提问人:bers 提问时间:7/1/2020 最后编辑:TheMasterbers 更新时间:8/21/2023 访问量:1396

问:

我知道浮点数的数值不准确的一般问题,但我希望 Excel 和 Google 表格的行为相同。不幸的是,他们没有 - 请参阅以下示例:

A1: 15.525         our reference
A2: =3*5.175       should equal 15.525
A3: =A2=A1         shows TRUE, as expected, in both
A4: =A2-A1         but A2 is actually smaller in Google Sheets, by -1.78E-15 [Excel shows 0.00E+00]

B1: =ROUND(A1,2)   shows 15.53, correct, in both
B2: =ROUND(A2,2)   shows 15.53, correct, in both - surprisingly in Google Sheets, looking at A4
B3: =B2=B1         shows TRUE, as expected, in both

C1: =B1-A1         shows 0.00499999999999901, in both
C2: =B2-A2         shows 0.00500000000000078, in both
C3: =C2=C1         shows FALSE, as expected, in both

D1: =C1<0.005      consistent with C1, in both
D2: =C2>0.005      consistent with C2, but inconsistent with correct rounding in B2, in both

那么明显的问题是什么呢?

  • A3:谷歌表格说,具有非零差异的数字是相等的(不寒而栗)
  • A4:Excel 显示行为不同的数字(C1、C2 等)之间的零差异
  • B2/D2:两者都对比四舍五入数字小 0.005 以上的数字进行四舍五入

我的问题是:

  • 我应该期望两者的行为不同吗?
  • 差异是不同实现(可能是数字格式)的无意副产品,还是有意为之?
  • 这在某处有记录吗?
Excel Google-Sheets IEEE-754 浮动精度

评论

0赞 Solar Mike 7/1/2020
你检查过Excel文档吗?
1赞 Variatus 7/1/2020
你不能乘以你走出暮光之城吗?
0赞 Eric Postpischil 7/1/2020
这在当前的 Google 表格网络版本中是不可重现的;单元格 A4 (“=A2-A1”) 显示零。
1赞 Eric Postpischil 7/1/2020
众所周知,Excel 会修补它如何舍入和显示事物。在 Excel 2008 for Mac (12.3.6) 中,A4 中的公式“=A2-A1”显示“0”。但是输入“=(A2-A1)”显示“-1.77636E-15”。单元格 A1 和 A2 似乎具有 IEEE-754 binary64 值,“A2-A1”进行减法并获得非零结果,但是,当公式为“=A2-A1”时,Excel 正在应用一些未公开的舍入规则并将结果强制为零。括号中的版本似乎绕过了这一点,让 Excel 将其视为不受 kludge 规则约束的常规计算,并显示实际结果。
0赞 Eric Postpischil 7/1/2020
请注意,如果在另一个单元格中输入“=A4”或“=(A4)”,它仍然显示为“0”,这意味着在A4单元格中强制归零的不仅仅是显示,而是与该单元格关联的记录结果。

答:

-1赞 Mateo Randwolf 7/1/2020 #1

这在某处有记录吗?

我能找到的唯一文档是 Excel 中关于浮点运算的这篇文章,可能会在 Excel 中给出不准确的结果。从那里,我们可以就您的其余问题得出一些结论。

我应该期望两者的行为不同吗?

是的,很可能实现是不同的。

差异是不同实现(可能是数字格式)的无意副产品,还是有意为之?

它们可能是由于实现限制。我不认为他们会故意返回不准确的内容。

Google 表格比 Microsoft Excel 更准确还是更准确?

为了测试准确性,我们需要手动或使用良好且值得信赖的计算器进行计算,然后将其与 Excel 和 Google 表格给出的结果进行比较。我们还需要在一系列公式和运算上测试这种准确性,以便能够得出一致的结论。

4赞 Eric Postpischil 7/3/2020 #2

观察

以下观察是在谷歌表格(2020-07-02的网页版,macOS 10.14.6上的Safari 12.1.2),Microsoft Excel 2008 for Mac 12.3.6和Numbers 10.0上进行的。在 Excel 中,首选项...> “设置显示的精度”>计算被禁用。

单元格已设置:

  • A1:。15.525
  • 答2: .=3*5.175
  • 答3: .=A2=A1
  • 答4: .=A2-A1
  • 答5: .=(A2-A1)
  • 答6: .=A4*1000000000000000
  • 答7: .=A5*1000000000000000
  • 答8: .=(1/3*3-1)*POWER(10,34)

观察到的结果是:

  • A3:所有三个电子表格中的“TRUE”。
  • A4:所有三个电子表格中的“0”。
  • A5:Google 表格中的“0”,Excel 中的“-1.77636E-15”,Numbers 中的“0”。
  • A6:Google 表格中的“-1.776356839”,Excel 中的“0”,Numbers 表格中的“0”。
  • A7:Google 表格中的“-1.776356839”,Excel 中的“-1.776356839”,Numbers 表格中的“0”。
  • A8:Google 表格中的“0”,Excel 中的“0”,Numbers 表格中的“-1”。

如果单元格格式从“自动”更改为“科学型”,则 Google 表格结果会发生变化:

  • A4:“-1.78E-15”。
  • A5:“-1.78E-15”。

否则,除了外观更改(例如显示“0.00E+00”而不是“0”)外,其他单元格或电子表格中不会有任何更改。

假设

上述观察结果与以下观点一致:

  • Google 表格使用 IEEE-754 64 位二进制格式,不会弄虚入。(最初显示“0”是由于自动选择定点或类似格式。
  • Excel 使用 IEEE-754 64 位二进制格式,并根据使用的公式对舍入进行模糊处理。也就是说,四舍五入不纯粹是被四舍五入的数字的函数;它依赖于上下文。此外,四舍五入不仅是为了展示;它应用于单元格值,因此进一步的计算将使用舍入后的结果。
  • Numbers 使用十进制浮点格式,有效数字为 34 位。没有观察到模糊的四舍五入。

进一步调查

在 Google 表格和 Excel 中观察到的 −1.776356839•10−15 值是 IEEE-754 64 位二进制格式的特征,因此他们很可能正在使用该格式。在 Numbers 中观察到的 −10−34 值不太确定,因此应进一步研究它使用十进制格式的假设。

上面的注释在 Excel 中对接近零的数字进行舍入,四舍五入后的值用于进一步的计算。另一个实验是构造一个不是 1 但显示为 1 但具有简单公式的数字,然后在进一步计算中使用该单元格,以查看是否使用了舍入前或舍入后的值。

更多观察结果

单元格已设置:

  • B1:.=1/49*49-1
  • B2:.=1/49*49
  • B3:.=B2-1

之所以选择 49,是因为当使用 IEEE-754 二进制 64 进行评估时,生成的数字略低于 1。(对于较小的分母,例如 with 不会发生这种情况,因为尽管除法中有四舍五入,但乘法中也存在四舍五入来补偿,从而产生正好为 1 的结果。49 是不会发生这种情况的最小整数。1/49*491/3*3

结果,采用科学格式:

  • B1:Google 表格中的“-1.11E-16”,Excel 中的“0.00E+00”,Numbers 表格中的“-2E-34”。
  • B2:Google 表格中的“1.00E+00”、Excel 中的“1.00E+00”、Numbers 中的“1E+00”。
  • B3:Google 表格中的“-1.11E-16”,Excel 中的“0E+00”,Numbers 中的“0.00E+00”。

同样,Google 表格似乎使用 IEEE-754 没有任何恶作剧。Excel 似乎已对结果进行了四舍五入。但是,如果添加括号,将 B1 设置为 或 B3 设置为 ,Excel 将显示“-1.11E-16”。这与在第一组观测值中使用括号时禁用舍入一致。=(1/49*49-1)=(B2-1)

然而,现在我们第一次在民数记中看到了一些恶作剧。我们预计 B1 和 B3 会显示相同的结果,但事实并非如此。 假设:数字在公式中使用更高的精度,但对单元格的最终结果使用更少的精度?

B1 结果与 34 位十进制数字一致。对于 34 位有效十进制数字,1/49 是 .02040816326530612244897959183673469。然后是 49 倍,即 .99999999999999999999999999999999981。四舍五入到 34 位有效数字得到 .9999999999999999999999999999999998,然后减去 1 得到 -2•10−34

进一步的实验(此处未详述)表明,Numbers 在内部使用 34 位十进制数字进行计算,但将最终单元格值四舍五入为 15 位十进制数字,并将其用于显示和进一步计算。