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