投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/2/6 07:42:23
記述漏れがあったので補足します。

4000文字上限回避のために文章を削っている際に、編集し損ねていたようで…。


> 一方、端数も含めて受け取りたいのであれば、
> Dim j As Integer を Dim j As Double に変更すれば OK ですね。
> この方法だと、「0 ÷ 0」の演算結果を

この方法だと、「0 ÷ 0」の演算結果を受け取ってもエラーになりません。
と書くつもりでした。

'下記はエラーになる 
Dim i As Integer = 0
Dim n As Integer = 0
Dim j As Integer
j = i / n  'OverflowException:算術演算の結果オーバーフローが発生しました。 



'下記はエラーにならない 
Dim i As Integer = 0
Dim n As Integer = 0
Dim j As Double  'As Integer から変更 
j = i / n  'j = Double.NaN 



> (Dim n, i, j As Decimal の場合は、0 除算でエラーとなりますが)
j だけでなく、n や i も Decimal にしていることに注意してください。
何故ならば、
> 「Integer値 / Integer値」の演算結果は Double 値となりますので
であるからです。しかし「Decimal 値 / Decimal 値」の演算結果は Decimal 型です。

'下記はエラーになる 
Dim i As Decimal = 0D
Dim n As Decimal = 0@
Dim j As Decimal  'As Integer から変更 
j = i / n  'DivideByZeroException:0 で除算しようとしました。 


エラーの種類が変化していることに注意してください。

変数がすべて Integer だった場合は、「演算結果(Double)をIntegerに代入したとき」に
OverflowException が発生していたのに対して、
変数をすべて Decimal にしていた時は、代入時ではなく「演算したとき」に
DivideByZeroException が発生することになります。


それと、ここでは意図的に 0 ではなく 0D や 0@ という表現にしています。
0 は Integer 型のリテラル、0.1 だと Double 型のリテラル、
0.1D や 0.1@ なら Decimal 型のリテラルを意味します。