2011-09-07 88 views
6

在VBA中我有这个不明显的舍入问题。VBA舍入问题

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

这是一个问题,为什么VBA会舍弃变量c?我没有发布任何四舍五入功能。我期待的价值是154614111.6687894847。即使我将变量c舍入或格式化为小数点后15位,我仍然没有得到预期的结果。

任何解释将不胜感激。

编辑:

使用cDec获得预期结果。我在乔纳森·艾伦的答复中Why does CLng produce different results?

阅读下面是结果的测试:

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

[浮点运算可能会不准确的结果在Excel(http://support.microsoft .com/kb/78113) – SeanC

回答

11

的原因是有限的precission可以存储在一个浮点变量。
对于一个完整的解释你应该读的论文什么每个计算机科学家应该知道关于浮点算术,由大卫戈德堡,发表在1991年3月号的计算调查。

Link to paper

在VBA默认浮点类型是Double其是IEEE 64位(8字节)的浮点数。

没有可用另一种类型的:Decimal这是一个96位(12字节)签署的10
简而言之可变功率比例整数,这提供浮点数到28位precission。

要在您的例子中使用:

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

感谢您的链接。 – Grekoz

3

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

我想你已经回答了它 - 但基本问题是值的“大小”之一,即多少数据可以存储在给定类型的变量中。

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

所以,当你将两个数字加在一起,它失去了最不重要值以保持在流量的允许精度范围内。

通过做你正在转换为不同类型的变量(十进制)的CDEC,其能够更精确