VBA Double vs Single舍入

时间:2013-08-29 07:22:08

标签: excel vba math excel-vba

在我的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

1 个答案:

答案 0 :(得分:5)

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

6.574999993

将向下舍入。对于双倍,可能是:

6.57500000000001

将围捕。


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

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 ...

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

enter image description here 它无法准确表示的原因是因为你只能做到这一点就是可以通过在允许的位数内对2的幂(如4,2,1 / 16等)求和来构造数字。

通常情况下,您无法始终相信打印出来的内容,因为打印例程了解并调整了有限的精度。因此,您几乎可以肯定得到6.575,因为这是给定位模式的最接近的十进制值,但位模式本身将用于计算。