2011-09-07 69 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,其能夠更精確