none
有個excel 2003 VBA的問題?? RRS feed

  • 問題

  • 各位先進您好:

    我使用EXCEL 2003 VBA編輯一個FUNCTION如下:

    Function Validate(ByVal dblInput As Double) As String
        Dim strInput As String
        Dim strCent As String
        strInput = Trim(Str(Int(dblInput)))
        strCent = Trim((Right(dblInput * 100, 2)))
        MsgBox Int(dblInput * 100) & "--" & strCent
    End Function

    我給一個值1234567.88,可是Int(dblInput * 100)卻等於123456787,我想不透為麼會少1

    而    strCent = Trim((Right(dblInput * 100, 2))) ,strCent就會等於88

    我在說明看int函數是無條件捨去小數點後面,回傳值是整數,但有時正常,有時又會少1真是奇怪了

     

    2006年7月13日 上午 02:05

解答

  • ... 這是計算機概論裡面浮點數特性會說的。

    你可以改用

    CLng(1234567.88 * 100)

    Int(Val(CStr(1234567.88 * 100)))

    1234567.88 * 100 的 16 進位值為 FFFFFF4F346F9D41

    123456788# 的 16 進位值為 00000050346F9D41

    123456788# - 1234567.88 * 100 = 1.11758708953857E-08

    就是這個誤差導致 1234567.88 * 100 為接近 123456788# 而小於 123456788# ,所以無條件捨去會捨去看不到的小數誤差。可將數值轉換為字串在轉換為數值後處理,可消去小數誤差。

    2006年7月13日 上午 11:44
    版主