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
那么明显的问题是什么?
- A3: Google 表格说具有非零差异的数字是相等的 (shudder)
- A4:Excel 显示行为不同的数字(C1、C2 等)之间的差异为零
- B2/D2:都向上一个比四舍五入的数字
小0.005以上的数字
我的问题是:
- 我应该期望两者的行为有所不同吗?
- 差异是不同实现(可能是数字格式)的无意副产品,还是有意为之?
- 这在某处记录了吗?
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 位十进制数字并将其用于显示和进一步计算。
我知道浮点数的数值不准确的普遍问题,但我希望 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
那么明显的问题是什么?
- A3: Google 表格说具有非零差异的数字是相等的 (shudder)
- A4:Excel 显示行为不同的数字(C1、C2 等)之间的差异为零
- B2/D2:都向上一个比四舍五入的数字 小0.005以上的数字
我的问题是:
- 我应该期望两者的行为有所不同吗?
- 差异是不同实现(可能是数字格式)的无意副产品,还是有意为之?
- 这在某处记录了吗?
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 位十进制数字并将其用于显示和进一步计算。