2012-10-01 204 views
3

當您運行執行數值計算並生成十進制值的VBA宏時,返回的結果可能不正確。Excel 2007 VBA計算錯誤

這裏有幾個例子:

Dim me_wrong as Double 
me_wrong = 1000 - 999.59 

RESULT = 0.409999999999968

Dim me_wrong_too as Double 
me_wrong_too = 301.84 - 301 

RESULT = 0.839999999999975

我從來沒有以前注意到了這一點。究竟是怎麼回事?

我已經看到了有關Office 97下面的文章,但在Excel 2007中無法找到的錯誤東西: http://support.microsoft.com/default.aspx?scid=kb;en-us;165373

再加上它並沒有解釋爲什麼我從來沒有看到過。

請幫忙!

回答

3

來自Office 97和VBA的問題的解釋同樣適用於Excel 2007.儘管遷移到了更高版本,但核心VBA系統基本保持不變,因此與舊VBA宏相同的準確性greml將會堅持。

基本問題在於二進制小數表示的固有不準確性,以及如何用IEEE浮點表示至少做了一些努力來減輕這種不準確性。有一個很不錯的處理IEEE代表的主題在this location.

* 編輯:只是一點額外的信息細節。 *

對於示出在一個簡單的情況下,這問題一個非常簡單的例子,考慮其中小數表示爲兩個逆功率求和的情況下,例如,2 -1,2 -2,2- -3等等。最終看起來像.5,.25,.125等。如果你代表,那麼這些數字就是,一切都很好。但是,考慮一個像.761這樣的數字; 2 -1 +2 -2讓你到.750,但現在你需要.011。 2 -3(.125)太大了,但是2 -4(.0625)太小了...所以你繼續用兩個較小的冪數,意識到你會從來沒有完全代表數字,正好是

選擇成爲您停止解決的地方,並接受固有的不準確性,因爲您解決/建模的問題「足夠好」。

+0

乾杯大衛,所以我只是很幸運,從來沒有發現過這個。添加並刪減不受此問題影響的號碼? –

+0

不錯的文章。這是一個直接標題爲「浮點算法可能會給Excel中的結果不準確」http://support.microsoft.com/kb/78113 –

+1

二進制分數的任何表示都受到這種不準確的影響,並且存在風險加法或減法或任何浮點操作。它是減輕不準確風險的一個問題。 –

1

不幸的是,這不是一個錯誤。

雙重表示遵循固定點符號,其中尾數是數字「1,x」,其中「1」是隱含的。有一個指數和一個符號,這使得在基數2中的完整表示。

相關問題是Base = 2,它使得「1,x」中的「x」爲有限精度(小數點後53位)二進制文件。認爲x = a52 * 1/2 + a51 * 1/4 + a50 * 1/8 + ... + a * 1 ** 1 /(2^52)+ a0 * 1 /(2^53),其中a < i>是尾數中的位。

試着用這種表示法獲得1,4,並且你擊中了精確牆...在二進制權重中沒有0.4的有限分解。所以這個規範指定你應該在真正的數字之前表示數字,這會給你留下0,39999..9997346(或者任何尾部)。

「好」消息是,我剛把灼燒四個「C」編碼天上週在這個問題上,如果你代表使用規模很小你的號碼,你可以不做雙打(比方說10^-9),然後在中存儲非常大的變量(long64),並使用除整數以外的任何東西(通過整數除法和剩餘部分數學切分整數和小數部分)來執行顯示函數。一種享受,我告訴你......不。