VB.NET では、両方のオペランドが整数であっても、/
演算子によって値が浮動小数点になります (結果が整数でない場合)。
そこで\
、オペランドに関係なく整数値を返す演算子を試してみました。
だから私\
は整数除算だと思った。
2.5 \ 3
になります0
。
今私は試し1.5 \ 2
ました。と予想しました0
が、結果は1
.
さて、それはバグですか、それとも正しい結果ですか?
実際の\
オペレーターは?
バグの場合は、VB6 を通じて存在します。
VB.NET では、両方のオペランドが整数であっても、/
演算子によって値が浮動小数点になります (結果が整数でない場合)。
そこで\
、オペランドに関係なく整数値を返す演算子を試してみました。
だから私\
は整数除算だと思った。
2.5 \ 3
になります0
。
今私は試し1.5 \ 2
ました。と予想しました0
が、結果は1
.
さて、それはバグですか、それとも正しい結果ですか?
実際の\
オペレーターは?
バグの場合は、VB6 を通じて存在します。
\
非整数で使用する場合は、最初にそれらを整数に変換します。これにより、丸めが発生します。CLng(1.5) \ 2
2 \ 2
1
使用Option Strict On
すると、これが行われていることがわかります。
ドキュメントRemarks
のセクションを参照してください。
除算を実行する前に、Visual Basic は浮動小数点数値式を Long に変換しようとします。... ロングへの変換もバンカーの四捨五入の対象となります。
つまり、1.5 \ 2 は 2 / 2 になり、1 になります。
バンカーの丸め (型変換関数から):
小数部分が正確に 0.5 の場合、整数変換関数はそれを最も近い偶数の整数に丸めます。たとえば、0.5 は 0 に丸められ、1.5 と 2.5 は両方とも 2 に丸められます。これはバンカーの丸めと呼ばれることもあり、その目的は、そのような数を多数加算したときに蓄積されるバイアスを補正することです。
バグではありませんが、単純に結果が最も近い整数に丸められます。演算子 / は、Decimal 型も忘れずに、数値と整数を float または double で除算するために使用されます。
よろしく。