VBA舍入问题

在VBA中我有这个模糊的舍入问题。

a = 61048.4599674847 b = 154553063.208822 c = a + b debug.print c Result: 154614111.66879 

这里是问题,为什么VBA四舍五入variablesc? 我没有发布任何四舍五入的function。 我期待的价值是154614111.6687894847。 即使我四舍五入或格式variablesc小数点后15位,我仍然没有得到我的预期结果。

任何解释将不胜感激。

编辑:

使用cDec获得了预期的结果。 在Jonathan Allen的回复中,我已经读到了CLng为什么会产生不同的结果?

这是testing的结果:

 a = cDec(61048.4599674847) b = cDec(154553063.208822) c = a + b ?c 154614111.6687894847 

原因是可以存储在浮点variables中的有限精度。
有关完整的解释,请阅读David Goldberg在1991年3月出版的“计算机调查”上发表的“每个计算机科学家应该了解浮点运算”一文

链接到纸张

在VBA中,默认浮点types是Double ,它是一个IEEE 64位(8字节)浮点数。

还有另一种types可用: Decimal ,它是一个96位(12字节)有符号整数,可变的幂为10
简而言之,这提供了浮点数到28位精度。

在你的例子中使用:

 a = CDec(61048.4599674847) b = CDec(154553063.208822) c = a + b debug.print c Result: 154614111.6687894847 

它不晦涩,但不一定明显。

我想你已经回答了这个问题 – 但是最基本的问题是值的“大小”之一,即给定types的variables中可以存储多less数据。

如果(而且这很粗糙),你可以计算第一个例子中每个数字的位数,你会看到你有15个数字,而浮点数(默认types)可以表示的值的范围是巨大的精度限于15位数(我确定有人会纠正这一点,我会打勾维基框…)

所以当你把两个数字加在一起的时候,为了保持stream量允许的精确度,丢失最不重要的值。

通过做一个cDec你转换到一个不同types的variables(十进制),能够更高的精度