「ほっ」と。キャンペーン
(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の場合の具体的な挙動については書いてませんでした。
[PR]
by jehoshaphat | 2008-04-28 10:11 | .Net開発 | Trackback | Comments(1)
トラックバックURL : http://jehupc.exblog.jp/tb/7830535
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。
Commented by nobu at 2015-08-26 10:23 x
最近接偶数丸めでしょう。0.5は切り捨てとは限りません。銀行家丸めと言って四捨五入より誤差の累積が少ない丸めです。丸めの種類はたくさんありますよ。


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