Google 表格是否比 Microsoft Excel 更准确或更准确?

Is Google Sheets less or more accurate than Microsoft Excel?

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

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

那么明显的问题是什么?

我的问题是:

Is this documented somewhere?

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

Should I expect the two to behave differently?

是的,很可能实现不同。

Are differences an unintentional by-product of different implementations (number formats, maybe), or intentional?

可能是由于实施限制。我认为他们不会故意 return 不准确。

Is Google Sheets less or more accurate than Microsoft Excel?

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

希望对您有所帮助。让我知道您是否需要其他任何东西或者您不明白什么。 :)

观察

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

已设置单元格:

  • A1: 15.525.
  • A2: =3*5.175.
  • A3: =A2=A1.
  • A4: =A2-A1.
  • A5: =(A2-A1).
  • A6: =A4*1000000000000000.
  • A7: =A5*1000000000000000.
  • A8: =(1/3*3-1)*POWER(10,34).

观察到的结果是:

  • A3:所有三个电子表格中的“正确”。
  • A4:所有三个电子表格中的“0”。
  • A5:Google 工作表中的“0”,Excel 中的“-1.77636E-15”,数字中的“0”。
  • A6:Google 表格中的“-1.776356839”,Excel 中的“0”,数字中的“0”。
  • A7:Google 表格中的“-1.776356839”,Excel 中的“-1.776356839”,数字中的“0”。
  • A8:Google 工作表中的“0”,Excel 中的“0”,数字中的“-1”。

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

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

除此之外,其他单元格或电子表格没有任何变化,除了外观上的变化,例如显示“0.00E+00”而不是“0”。

假设

以上观察符合:

  • Google Sheets 使用 IEEE-754 64 位二进制格式并且不会四舍五入。 (最初显示“0”是由于自动选择定点或类似格式。)
  • Excel 使用 IEEE-754 64 位二进制格式,并根据使用的公式更改舍入。也就是说,四舍五入不仅仅是被四舍五入的数字的函数;它取决于上下文。此外,四舍五入不仅仅是为了显示;它应用于单元格值,因此进一步计算使用 post 舍入结果。
  • Numbers 使用十进制浮点格式,尾数为 34 位。没有观察到四舍五入。

进一步调查

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

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

更多观察

已设置单元格:

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

49 是因为,当使用 IEEE-754 binary64 进行评估时,1/49*49 会产生一个略小于 1 的数字。(这不会发生在较小的分母上,例如 1/3*3,因为,尽管除法中有一个舍入,乘法中也有一个舍入来补偿,产生的结果恰好为 1。49 是不会发生这种情况的最小整数。)

结果,采用科学格式:

  • B1:Google 工作表中的“-1.11E-16”,Excel 中的“0.00E+00”,数字中的“-2E-34”。
  • B2:Google 工作表中的“1.00E+00”,Excel 中的“1.00E+00”,数字中的“1E+00”。
  • B3:Google 工作表中的“-1.11E-16”,Excel 中的“0E+00”,数字中的“0.00E+00”。

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

然而,现在我们第一次在 Numbers 中看到一些恶作剧。我们希望 B1 和 B3 显示相同的结果,但事实并非如此。假设:Numbers 在公式中使用的精度更高,但单元格的最终结果使用的精度更低?

B1成绩符合34位小数。到34位有效小数位,1/49是02040816326530612244897959183673469。那么49次就是.999999999999999999999999999999999981。四舍五入到 34 位有效数字得到 .9999999999999999999999999999999998,然后减去 1 得到 −2•10−34.

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