在我的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,因为那是最接近给定位模式的十进制值,但是位模式本身将用于计算。