Excel浮点行为规范
尽pipeExcel使用标准的IEEE754二进制64格式,但它并不使用相同的规则进行算术和比较,例如
=0.1+0.2=0.3
返回TRUE
等 例子 。
在任何地方logging确切的行为?
这个文件切线地解决这个问题:
https://support.microsoft.com/en-us/kb/78113
尤其要看:
然而,Excel 97引入了一个优化,试图纠正这个问题。 如果加法或减法操作的结果值为零或非常接近零,则Excel 97及更高版本将补偿由于将操作数转换为二进制或从二进制转换而引入的任何错误。
如果他们将这个“优化”应用到0.1 + 0.2
和0.3
之间的差值,那么它显然会被转换为0,这意味着他们不严格地遵循标准。
做了一些实验后,我确定了如下的行为:
-
如果等于15个十进制数字(即printf术语中的
"%.14e"
),则根据相等运算符(=
),两个值是“相等的”- 小于(
<
)和小于或等于(<=
)被定义为与此一致(即,如果在IEEEalgorithm下为“真正的Excel”,并且这些值不是“Excel等于”)。
- 小于(
-
如果单元格公式中的最终运算符(根据通常的运算符优先级)为
-
或+
,并且结果的大小小于第一个参数的8个ulps(最后一个单元),则结果设置为零。- 这个行为可以通过将整个expression式包含在圆括号中来抑制(或者等价地,可以将这种包裹圆括号看作是一个操作符)。
-
SUM
似乎与链接的+
(阈值看起来是累积和的第二个最后一个元素的8 ulps)相同,但是截断不能通过包围圆括号来抑制。
请注意,这些不一致,因为这些值可能是“Excel相等”,但有一个非零的差异,反之亦然。
因此,如果您想在Excel中使用更接近IEEE算术的东西:
-
将所有公式包括在最后一个括号中
-
使用
(ab)<0
而不是a<b
(对于其他布尔运算符类似) -
避免使用
SUM
(由于缺less子正常和有符号的零,这仍然不是严格的)