2014-04-01 49 views
0

我遇到了計算在我的函數中關閉的問題。我正在使用VB6,這可能是我的第一個問題。發生了什麼是我遍歷一個循環,從一個變量步進到另一個變量,逐步變量,計算每個項目的折扣。它將每個計算得出的折扣放在文本文件查找表中。如果用戶輸入的值在這兩個值之間,那就是它應用的折扣。被設置爲錯誤值的變量

問題出在計算折扣價值。假設我每步每單位折扣0.04美元。因此,第一步的折扣將是.04,然後是.08,然後是.12等。要計算此值,它會計算經過指定範圍的步數,然後將步數乘以每步折扣值。這是主要問題。當我這樣做,我得到一個浮點舍入錯誤。我將總步驟(1)乘以總折扣(.04)並獲得.03999999999999999。

這不會是一個大問題,但是因爲它多次計算出來,並且將計算添加到計算中,所以我不會有這種精度損失,它會在晚些時候丟掉我的值。我如何避免這種舍入錯誤? 另外值得注意的是,我分配的價值是雙打和單打,這是否可以解決問題?

TL; DR:1 * .04 = .03999999999999出於某種原因在VB6中。即使我分配一個浮點變量= 15.1,它也會變成= 15.1000003814697。我將如何去解決這個問題?

+0

嘗試使用十進制數據類型而不是double或single。另外,無處不在地使用它。 –

+0

我應該說你應該在計算中轉換爲十進制。例如:CDec(變量1)* CDec(變量2) –

回答

1

浮點值類型(單和雙)都有這個問題,由於它們在內存中被表示爲兩部分:尾數和指數。如果你想要整數類似的精度,那麼你必須使用十進制子類型。 VB6不直接支持這種類型。例如,你不能寫:

Dim decValue As Decimal 
decValue = 1.536 

相反,Decimal支持通過Variant類型,例如,

Dim vdecValue As Variant 
vdecValue = CDec (1.536) 

好處是你得到了你想要的精度。缺點是每個值佔用14個字節而不是4或8個。您也受限於接受Variant/Decimals的函數。

這是一個恥辱,你還沒有提供一個算法。你很可能可以預先解決舍入問題。例如,如果您的折扣在已知範圍內,並且已知精度(例如0.11至0.95),則可以將總折扣記錄爲整個值的百分之一。您將百分之一作爲整數/長整型值,並且只在最後可能的點處轉換爲單/雙。顯然,這隻適用於你不需要運行總數的情況。具有諷刺意味的是,這個「假定的小數點」正是VB代表貨幣和十進制值的方式。