Board logo

標題: [發問] 計算過程中溢位 [打印本頁]

作者: EGBT    時間: 2015-11-25 12:10     標題: 計算過程中溢位

如標題:

想請教各位大大,在計算的過程中,我只需要取到小數點第二位(四捨五入)。

例如:2.2233  => 2.22,否則常常溢位...

請教各位大大如何處理?
作者: GBKEE    時間: 2015-11-25 13:11

回復 1# EGBT


VBA 的說明

溢位 (錯誤 6)
當指定超出目標的限制時就會發生溢位。此錯誤有以下的起因和解決方法:
此指定的結果、計算或資料型態轉換太大以致於無法在變數型態所允許的範圍內表示出來。
指定值到足夠表示的型態之變數上。
指定給屬性時超出此屬性能接受的範圍。
確定您的指定適合此屬性的範圍。.
當您試圖在計算中使用數字時,數字被強迫轉換成一個整數,但是結果超出了整數的範圍。例如:
    Dim x As Long

    x = 2000 * 365   ' 錯誤:溢位
要解決該問題,按如下方式輸入數字:
    Dim x As Long
x = CLng(2000) * 365
詳細資訊,可選取有疑問的項目並按下 F1 (在Windows中) 或 HELP (在Macintosh上)。

了解看看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim x  As Variant  '任何型態
  4.     Range("A1") = 500
  5.     MsgBox TypeName([a1].Value)
  6.     '儲存格數字範圍 都是Double 資料型態
  7.    
  8.     MsgBox TypeName(2000)
  9.     '型態轉換函數 'CLng  'CDbl
  10.     MsgBox TypeName(CLng(2000))
  11.     MsgBox TypeName(CDbl(2000))
  12.     x = CLng(2000) * 365
  13.     MsgBox TypeName(x)
  14.     x = 10 ^ 10
  15.     MsgBox TypeName(x)
  16.   '  x = CLng(x) * 365   '溢位
  17.     x = CDbl(x) * 365
  18.     MsgBox TypeName(x)
  19.    
  20. End Sub
複製代碼

作者: EGBT    時間: 2015-11-25 14:32

回復 2# GBKEE

感恩大大耐心地回答~
作者: EGBT    時間: 2015-11-25 16:08

回復 2# GBKEE


    GBKEE大大..不好意思小弟還是模模糊糊的..

x = 2000 * 365
算出來是730000

Long範圍-2147483648 到 2147483647

-2147483648 < x < 2147483647

沒有超出範圍,為什麼會溢位?

還有在解決辦法那邊,為什麼要去轉換Clng(2000)...?
作者: c_c_lai    時間: 2015-11-25 17:38

回復 4# EGBT
從 Excel 『監看式』視窗中來觀察變數型態的變化:
  1. Sub Ex2()
  2.     Dim x As Long, y
  3.    
  4.     '  Watch :   : x           : 0       : Long
  5.     '  --------------- (舉例一) --------------------------
  6.     y = 20000
  7.     '  Watch :   : y           : 20000   : Variant/Integer
  8.     x = y * 365
  9.     '  Watch :   : y * 365     : 7300000 : Variant/Long
  10.     '  Watch :   : 365         : 365     : Integer
  11.     '  Watch :   : x           : 7300000 : Long
  12.    
  13.     '  --------------- (舉例二) --------------------------
  14.     x = 20000 * 365    '  執行階段錯誤 '6': 溢位
  15.     '  Watch :   : 20000       : 20000   : Integer
  16.     '  Watch :   : 365         : 365     : Integer
  17.     '  Watch :   : 20000 * 365 : <溢位>  : Empty
  18.    
  19.     '  --------------- (舉例三) --------------------------
  20.     x = CLng(20000) * 365
  21.     '  Watch :   : CLng(20000) : 20000   : Long
  22.     '  Watch :   : 365         : 365     : Integer
  23.     '  Watch :   : x           : 7300000 : Long
  24. End Sub
複製代碼

作者: stillfish00    時間: 2015-11-25 19:55

本帖最後由 stillfish00 於 2015-11-25 20:00 編輯

回復 4# EGBT
你可以看F1說明,尋找算術運算子中的 "* 運算子":
裡面有提到,
result 的資料型態通常與最精密的運算式相同。而精確度由最小到最大的順序是 Byte、Integer、Long、Single、Currency、Double和 Decimal。但以下是例外.......................(自己看說明的例外情況,我就不寫了)


2000 和 365 都是做為 Integer來運算,由上面說明知道運算結果也會存放在Integer資料型態的空間,但因超出 Integer資料型態可表達的範圍所以溢位了。

版大用 CLng(2000) * 365 解決,所以變成一個 Long乘上一個 Integer,因為 Long更精密,由上面說明知道運算結果也會存放在Long,所以沒溢位。

也可寫成 x= 2000& * 365,標明程式中的2000數字是一個Long的數字(或是兩個都標),意思是一樣的。
所以溢位跟你一開始說的四捨五入一點關係都沒有。
作者: EGBT    時間: 2015-11-25 21:07

回復 5# c_c_lai


    太猛啦~!!!感恩大大
作者: EGBT    時間: 2015-11-25 21:07

回復 6# stillfish00


    大大感謝你~耐心回答的很清楚!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)