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(十进制),能够更高的精度