4

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

如果是单身:

? Application.Round(6.575!, 2)
 6.57 

双倍的情况下:

? 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

4

1 回答 1

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

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

在此处输入图像描述 无法准确表示它的原因是因为您只能这样做是可以通过在允许的位数内对 2(如 4、2、1/16 等)的幂求和来构造该数字。

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

于 2013-08-29T07:27:42.917 回答