VBA双vs单舍入

在我的MS Excel我有不同的数据types舍入操作的行为:

在单一的情况下:

? 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

在双倍精度中join了更多的0011,它们的重量足以使得数字稍大于6.575(6.57500000000000017763568394003),因此它变为6.58

可能是因为浮点精度的不同限制。 当您使用6.575的值时,计算机会select最接近的近似值。 对于一个单一的,这可能是:

 6.574999993 

这将下降。 对于双重,可能是:

 6.57500000000001 

这将收起来。


澄清,IEE754 6.575的单精度比特值是:

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

(在最后重复0011通常是一个无限循环值的标志,一个不完全可以表示)。

双重也是非常相似的,它有以下几点:

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

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

在这里输入图像描述 不能准确表示的原因是因为你只能这样做,这个数字可以通过在允许的位数内加上两个幂(如4,2,1 / 16等)来构造。

一般来说,你不能总是相信从打印例程知道打印出来的东西,并调整有限的精度。 所以你几乎肯定会得到6.575,因为这是给定位模式的最接近的十进制值,但是位模式本身将被用于计算。