VBA研究 浮點數計算總是有誤差的

2021-07-04 12:44:33 字數 1139 閱讀 4548

數字有兩種表達方式,一種是整數,一種是浮點數。浮點數是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由乙個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數為10的科學計數法。

計算機中儲存

浮點數的方式決定了浮點數往往是個近似值,因為日常生活中我們用的是十進位制,而計算機用的是二進位制,二進位制很難精確的表達十進位制的小數,這裡不想討論計算機是如何儲存浮點數的,那會是很長的一篇枯燥文字,這裡僅以實驗來驗證,請看下面程式:

sub tt1()

for i = 0 to 1000 step 0.1

debug.print i

next

end sub

執行上面你會發現,前面可以正確顯示的數值,只有一位小數,加到6以後,

小數點後就暴增到了十幾位,結果如下:

。。。5.3 

5.4 

5.5 

5.6 

5.7 

5.8 

5.9 

6 6.1 

6.19999999999999 

6.29999999999999 

6.39999999999999 

6.49999999999999 

6.59999999999999 

6.69999999999999 

。。。這就是浮點數的累積誤差,因為計算機的二進位制儲存無法精確的儲存0.1這個數字。把上述程式的步長換成0.125,再執行上述程式,則不再出現誤差,這是因為二進位制可以精確的儲存0.125這個數字。

這樣的誤差可能導致比較失誤,比如上面的值,你覺得應該等於6.2的,但實際值卻是小於6.2,所以,在一些需要精確計算、精確比較的場合,最好不要用浮點數。如果原始資料是浮點數,可以先化成整數計算、比較,然後再還原成浮點數。比如上述程式可以寫成如下:

sub tt1()

for i = 0 to 1000 step 1

debug.print i / 10

next

end sub

這樣就可以避免浮點數計算造成的累積誤差。此外,浮點數應盡量避免精確比較,一般採取大於、小於這樣的比較,以免產生邏輯錯誤。

浮點數計算

bigdecimal工具類封裝 public class bigdecimaltool 提供精確的減法運算。param v1 被減數 param v2 減數 return 兩個引數的差 public static double sub double v1,double v2 public stati...

浮點數進行計算

public static void main string args 為什麼會出現這種情況?計算機採用二進位制進行計算,有些資料可以用二進位制表示。如0.5 1 2 2 1 但是有些不行,如0.1,這就好像1 3用十進位制無法準確的表示。計算機採用機器語言來表示數值,即二進位制 名稱意義 原碼正數...

定點數和浮點數 定點數和浮點數計算

這個東西其實不是很難,但是確實足夠繞的,因為從十進位制的加減乘除轉換到二進位制的加減乘除就已經很麻煩了,然後為了選拔人才,不給你二進位制,直接給你十六進製制,當然最麻煩的還是補碼和移碼,確實足夠 但是給予足夠的練習還是可以比較熟練的,公式稍後會整理到置頂的公式大全中。可以看完了以後去嘗試一下相關計算...