人気ブログランキング | 話題のタグを見る
(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の場合の具体的な挙動については書いてませんでした。
by jehoshaphat | 2008-04-28 10:11 | .Net開発


<< ドメインコントローラを外部のN... (.Net)オリジナクラスのド... >>