在 Excel 中,我有一个A1
包含公式的单元格=1/(1/(1/(1.6-1)-1)-1)
。结果显示为2
,从数学上来说是正确的。但我知道浮点表示的优点...
现在当我检查单元格的值是否平等的到2
(=A1=2
),我得到TRUE
。并<
给出FALSE
。但是当我减去 2
( =A1-2
),我得到-1.77635683940025E-15
( -2^-49
),所以一定是较少的比2
!
屏幕截图(带有荷兰小数点分隔符和暗模式):
我希望这些检查能够一致。为什么不一致?是因为差异非规范化?
这是错误还是功能?我发现一些文档但据我所知,它并不能解释这种不一致性。
我使用的是 Microsoft Excel 365 MSO (16.0.13001.20338) 64 位。我的文件可以从 Google Drive 下载。顺便说一下,谷歌确实显示了 0。
答案1
我找到了一些文献但据我所知它并不能解释这种不一致性。
我认为“示例:添加负数”涵盖了这一点:
- 43.1-43.2 = -0.1 - 它已经无法正确存储,但仍然可以正确显示,与 A1 相同,它不完全是 2,但表现为 2
- 当你在 Microsoft 示例中添加 1 或在你的示例中减去 2 时,错误就变得明显
这里的关键是 Excel 存储数字而不是小数。52 位比 15 位小数稍微精确一些,当差异小于 10^-15 时,它可能仍会被存储,但在显示或比较时都会四舍五入,但这会导致计算差异。
但这并不能解释为什么 Excel 认为 =2 为 TRUE
当您要求 Excel 将 2(十进制)与 A1 中的值(已存储为二进制)进行比较时,它首先需要转换其中一个数字。它将 A1 转换为十进制,这正好是 2精度为 15 位小数。(为什么它转换为十进制进行比较确实没有记录,我不知道原因)