VB6.0のInt関数・Fix関数がなんかおかしい



平成もあと僅かとなったが、未だにVB6.0で開発・運用されているシステムがそこら中で稼働しており、しばしば苦しめられることがある。
つい先日も、十数年前にVB6.0で構築されたシステムでバグが見つかって呼び出された。
工場の棚卸しの在庫量が合わないとの連絡があり、駆けつけて行って現地でドハマりしたのでここにメモしておく。

だれが作成したのかもわからないシステムで、当然のように仕様書は残ってない。ソースは履歴コメントだらけ。
地道にデバッグ実行で隅から隅まで追いかけて、やっと原因を特定できた。

Int関数の使い方によって、実行結果に差が出ていた。

【例】
Sub Main()
 ''Int関数の引数内で乗算する
 Dim i1 As Integer
 i1 = Int(27.7 * 100)

 ''乗算してDouble型にキャスト
 Dim i2 As Integer
 i2 = Int(CDbl(27.7 * 100))

 ''Double型の変数に一旦計算結果を代入してからInt関数実行
 Dim i3 As Integer
 Dim d3 As Double
 d3 = 27.7 * 100
 i3 = Int(d3)

 Debug.Print "i1 = " & i1
 Debug.Print "i2 = " & i2
 Debug.Print "i3 = " & i3

End Sub

【実行結果】
i1 = 2769
i2 = 2770
i3 = 2770
Fix関数でも同じ事が起こる。
ちなみにVB.NETでも同じコードを実行して試してみたが、このような現象は発生しなかった。

<スポンサーリンク>


0 件のコメント :

コメントを投稿