タイトル : Re^4: 数字の比較について(ありがとうございます) 投稿日 : 2017/01/20(Fri) 19:35 投稿者 : 魔界の仮面弁士
> よかった。^演算子が使えないですか ^演算の結果は常に Double 固定ですし、各項も事前に Double 化されます。 (VB.NET の ^演算子は、コンパイル時に Math.Pow での呼び出しへと変わります) VB6/VBA も、第一項、第二項、演算結果すべてが Double 型で処理される仕様です。 ――厳密に言えば、Variant型(内部形式 vbDouble もしくは vbNull)にもなりえますが。 とはいえ、Integer ^ Integer などの場合は、結果が整数であることが明確なので、 結果が Double だったとしても、そのまま結果を CInt や CLng するだけで十分かと。 もし、Decimal ^ Integer での演算を求めるなら、For ループで乗除算を繰り返すための Function Power(base As Decimal, exponent As Integer) As Decimal な拡張メソッドを用意してやれば対処できます。 > 統一は止めときます No11788 にも書きましたが、統一はするべきです。VB6 でも VB.NET でも。 ただ、すべてを一つのデータ型で補うのは現実的には無理なので、 要所要所で明示的に型変換することになりますね。 各データ型の特性を把握した上で、丸め誤差、桁落ち、情報落ちを 防ぐようなコーディングを心がけましょう。 VB.NET 型名 VBA の型名 サイズ 符号桁 有効桁数 小数部の長さ ----------- ---------- ------- ------ -------- -------------------- Double Double 64 bit 1 bit 1+52 bit 11 bit (-1022〜1023) Single Single 32 bit 1 bit 1+23 bit 8 bit (-126〜127) Decimal (Deciaml) 128 bit 8 bit 96 bit 8 bit (0〜28) - Currency 64 bit 1 bit 63 bit 0 bit (4) ULong - 64 bit 0 bit 64 bit 0 bit (なし) Long LongLong 64 bit 1 bit 63 bit 0 bit (なし) UInteger - 32 bit 0 bit 32 bit 0 bit (なし) Integer Long 32 bit 1 bit 31 bit 0 bit (なし) UShort - 16 bit 0 bit 16 bit 0 bit (なし) Short Integer 16 bit 1 bit 15 bit 0 bit (なし) Byte Byte 8 bit 0 bit 8 bit 0 bit (なし) SByte - 8 bit 1 bit 7 bit 0 bit (なし) UIntPtr - 32 / 64 0 bit 32 / 64 0 bit (なし) IntPtr LongPtr 32 / 64 1 bit 31 / 63 0 bit (なし) |