レガシーは消えず

リタイアしたプログラマのコーヒータイム

今さらの CInt, Int, Fix について

CIntとIntは式を評価してInt型へキャスト、Intは数値の整数部分を返す関数です。問題は名前がよく似ているため間違ってもなかなか気が付かないことです。整数部分を取り出す関数Fixもついでに調べてみましょう。

'例1:正数のとき
Dim Num = 10.6
Console.WriteLine("CInt={0}, Int={1}, Fix={2}", CInt(Num), Int(Num), Fix(Num))
’結果は CInt=11, Int=10, Fix=10

'例2:負数のとき
Dim Num = -10.6
Console.WriteLine("CInt={0}, Int={1}, Fix={2}", CInt(Num), Int(Num), Fix(Num))
’結果は CInt=-11, Int=-11, Fix=-10

CIntは結果を丸めますが、IntとFixは丸めません。Intは「指定した数を越えない最大の整数」を、Fixは「指定した数の整数部分」を返します。従ってIntとFixは引数の正負で結果が違います。
またCIntの戻り値はIntegerですがIntとFixの戻り値はDecimalです。なので上の例を正確に表現すると

'例1:正数のとき
Dim Num As Double = 10.6#
Console.WriteLine("CInt={0}, Int={1}, Fix={2}", CStr(CInt(Num)), CStr(CInt(Int(Num))), CStr(CInt(Fix(Num))))
'結果は CInt=11, Int=10, Fix=10

'例2:負数のとき
Dim Num As Double = -10.6#
Console.WriteLine("CInt={0}, Int={1}, Fix={2}", CStr(CInt(Num)), CStr(CInt(Int(Num))), CStr(CInt(Fix(Num))))
'結果は CInt=-11, Int=-11, Fix=-10

私は Int関数 は使いません。私の関わってきた業務用アプリでは「整数に丸める」ことがほぼなかったためです。ならば最初から紛らわしい関数は使わないのが一番です。整数部分を求めるのは文字通り Fix のみで事足ります(CIntは文字通りキャストで使いますが)。