在我的MS Excel中,对于不同的数据类型,舍入运算具有不同的行为:

如果是单身:

? Application.Round(6.575!, 2)
 6.57


如果是Double:

? Application.Round(6.575#, 2)
 6.58


有人知道为什么吗?



更新:@paxdiablo提供了一个很好的答案,所以在这里不久就重现一下:

在单精度中,6.575是二进制表示形式的0 10000001 101001 0011 0011 0011 0011或6.57499980926513671875。这四舍五入为6.57

在“双精度”中,添加了更多0011,并且其重量足以使数字稍微大一些,为6.575(6.57500000000000017763568394003),因此舍入为6.58。

最佳答案

可能是因为浮点精度的限制不同。当使用类似6.575的值时,计算机将选择最接近的近似值。对于一个人来说,可能是:

6.574999993


这将四舍五入。对于双打,可能是:

6.57500000000001


将会四舍五入。



澄清一下,对于6.575,IEE754单精度位值为:

s eeeeeeee ffffff ffff ffff ffff ffff f
0 10000001 101001 0011 0011 0011 0011 0


(在末尾重复0011通常是一个无限重复值的符号,一个不能精确表示的值)。

double也非常相似,它具有以下位:

s eeeeeeeeeee ffffff ffff ffff ffff ffff ...
0 10000000001 101001 0011 0011 0011 0011 ...


其中也有重复序列(请参见下文)。


之所以无法准确表示,是因为您只能这样做,因为可以通过在允许的位数之内将2的幂(例如4、2、1 / 16等)相加来构造数字。

通常,由于打印例程知道并针对有限的精度进行调整,因此您不能始终信任要打印的内容。因此,您几乎可以肯定会得到6.575,因为那是最接近给定位模式的十进制值,但是位模式本身将用于计算。

10-06 11:03