为什么Excel不按照8字节的IEEE 754进行轮换

以下expression式在C#中的计算结果为false

 (1 + 1 + 0.85) / 3 <= 0.95 

因为(1 + 1 + 0.85) / 3评估为大于0.95 0.95000000000000007 ,所以在大多数实现IEEE 754的其他编程语言中,这是这样做的。

但是,即使Excel也应用了大部分IEEE 754 ,Excel 2013中的以下评估为TRUE:

 = ((1 + 1 + 0.85) / 3 <= 0.95) 

有什么具体的原因吗? 上面链接的文章没有提到可导致此行为的任何自定义的Excel实现。 你可以告诉Excel要严格按照IEEE 754标准吗?

请注意,尽pipe大多数Excel问题都应该在superuser.com上提出,但这个问题涉及浮点运算,这是编程语言中的一个常见问题。 从这个问题的主题来看,Excel是一种像C#或Java这样的编程语言。

你链接到的文章是明确的做一些非标准的值接近0:

当值达到零时的示例1.在Excel 95或更低版本中,将以下内容input到新的工作簿中:A1:= 1.333 + 1.225-1.333-1.225

2.右击单元格A1,然后单击格式单元格。 在数字选项卡上单击类别下的科学。 将小数位数设置为15.而不是显示0,Excel 95显示-2.22044604925031E-16。

然而,Excel 97引入了一个优化,试图纠正这个问题。 如果加法或减法操作的结果值为零或非常接近零,则Excel 97及更高版本将补偿由于将操作数转换为二进制或从二进制转换而引入的任何错误。

未指定的“试图纠正这个问题的优化”意味着当需要与IEEE 754严格一致时,应该谨慎使用Excel进行数值计算。 也许使用VBA(这是不太可能有这个“优化”?)可能是一个解决方法。