3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(VB.Net)DoubleからIntegerへのキャスト時の小数点以下のおかしな挙動。

doubleからintegerにキャストするときに、小数点以下の扱いですが、どうやらCやJavaのように切り捨てではないようです。
VB.Netの場合は結果は丸められるようです。(VB6もそうだったのか?)
しかも丸めの法則が理解不能です。
具体的には下記のコードを見比べてください。

C#

double dblA = 0.4;
double dblB = 0.5;
double dblC = 0.51;
double dblD = 0.6;

int numA, numB, numC, numD;
numA = (int)dblA;
numB = (int)dblB;
numC = (int)dblC;
numD = (int)dblD;

Console.WriteLine("numA="+numA);
Console.WriteLine("numB="+numB);
Console.WriteLine("numC="+numC);
Console.WriteLine("numD="+numD);

//結果
//numA=0
//numB=0
//numC=0
//numD=0

C#だとキャスト時に小数点以下は無条件に切り捨てになります。
これは私が今まで慣れ親しんできたC,Javaと同じ形で納得できます。

VB.Net

Dim dblA As Double = 0.1
Dim dblB As Double = 0.5
Dim dblC As Double = 0.51
Dim dblD As Double = 0.6

Dim numA, numB, numC, numD As Integer
numA = CType(dblA, Integer)
numB = CType(dblB, Integer)
numC = CType(dblC, Integer)
numD = CType(dblD, Integer)

Console.WriteLine("numA=" & numA)
Console.WriteLine("numB=" & numB)
Console.WriteLine("numC=" & numC)
Console.WriteLine("numD=" & numD)

結果
numA=0
numB=0
numC=1
numD=1

これをどう思いますか?
最初は勝手に四捨五入してくれるのか~と思ってましたがそうでないようです。
.00 <= 値 <= .5 までは切り捨てになるようです。
不思議なことに .5 <= 値 < .0 までは切り上げになるようです。
気持ち悪いのは .5 は切り捨てなのに .51 が切り上げになるという点ですね。
四捨五入でもないし五捨六入でもない。。
どうやらVB6からの負の遺産みたいですが、どうせ.Netにしたんだからそこらへんの分かりにくい仕様も変更してほしかったです。

いちおうMSDNにもキャスト時に丸められることは書いてましたが、VBの場合の具体的な挙動については書いてませんでした。

追記:コメントしてくださった方によるとこれは銀行家丸め(偶数丸め、ISO丸め、JIS丸めとも)と呼ぶようです。
詳しくは「銀行家の丸め」とは何か | 会計SEのメモを参考に。。