虽然Excel使用标准的IEEE754二进制64格式,但它并没有使用相同的算术和比较规则,例如:
=0.1+0.2=0.3
在任何地方都记录了确切的行为吗?
答案 0 :(得分:1)
本文档切向解决了这个问题:
https://support.microsoft.com/en-us/kb/78113
特别参见:
然而,Excel 97引入了一种尝试纠正的优化 对于这个问题。应该进行加法或减法运算 在值为或非常接近零,Excel 97及更高版本将 补偿由于转换而引入的任何错误 来自二进制文件的操作数。
如果他们将此“优化”应用于0.1 + 0.2
和0.3
之间的差异,则显然会将其转换为0,这意味着他们并未严格遵守标准。
答案 1 :(得分:1)
做了一些实验后,我确定了以下行为:
如果等值运算符(=
)等于15个有效十进制数字(即printf术语中的"%.14e"
),则两个值“相等”
<
)且小于或等于(<=
)被定义为与此一致(即如果在IEEE算术下为真,则“Excel小于”为真,并且值不是“Excel相等”)。如果单元格公式中的最终运算符(根据通常的运算符优先级)为-
或+
,则结果的大小小于8 ulps(最后位置的单位) )第一个参数,然后结果设置为零。
SUM
似乎与+
的链式序列的行为相同(阈值似乎是累积和的倒数第二个元素的8个核心),但是截断无法通过括起括号来抑制。
请注意,这些值不一致,因为值可能是“Excel相等”但具有非零差异,反之亦然。
因此,如果您想在Excel中更接近IEEE算法:
将所有公式包装在最后的括号中
使用(a-b)<0
代替a<b
(对于其他布尔运算符也类似)
避免使用SUM
(由于缺少次正规和有符号零,这仍然不会很严格)