VBA Double vs Single舍入

Rus*_*tam 4 math excel vba excel-vba

在我的MS Excel中,我对不同数据类型的舍入操作有不同的行为:

如果是单身:

? Application.Round(6.575!, 2)
 6.57 
Run Code Online (Sandbox Code Playgroud)

如果是Double:

? Application.Round(6.575#, 2)
 6.58 
Run Code Online (Sandbox Code Playgroud)

有人知道为什么吗?


更新:@paxdiablo给出了一个很好的答案,所以只是为了在这里重现它:

在单精度中,6.575是二进制表示的0 10000001 101001 0011 0011 0011 0011,或6.57499980926513671875.这轮到6.57

在双精度中,增加了更多的0011,它们的重量足以使数量略大于6.575(6.57500000000000017763568394003),因此它将达到6.58

pax*_*blo 5

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

6.574999993
Run Code Online (Sandbox Code Playgroud)

这会倒圆.对于双倍,它可能是:

6.57500000000001
Run Code Online (Sandbox Code Playgroud)

这会围捕.


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

s eeeeeeee ffffff ffff ffff ffff ffff f
0 10000001 101001 0011 0011 0011 0011 0
Run Code Online (Sandbox Code Playgroud)

(0011在最后重复通常是无限重复值的标志,一个不能完全代表).

双重也非常相似,它有位:

s eeeeeeeeeee ffffff ffff ffff ffff ffff ...
0 10000000001 101001 0011 0011 0011 0011 ...
Run Code Online (Sandbox Code Playgroud)

它也有重复序列(见下文).

在此输入图像描述 它无法准确表示的原因是因为你只能做到这一点就是可以通过在允许的位数内对2的幂(如4,2,1/16等)求和来构造数.

通常,您不能总是相信打印出来的内容,因为打印例程知道并调整有限的精度.因此,您几乎肯定会得到6.575,因为这是给定位模式的最接近的十进制值,但位模式本身将用于计算.

  • @mehow,好吧,vba是编程(并且ieee754格式肯定是,鉴于这里有关于它的5亿个问题),它不像OP正在寻找一个单元格公式:-) (2认同)