投稿者 るきお  (社会人) 投稿日時 2020/10/6 18:21:13
プログラムありがとうございます。

RoundMultiple関数の第2引数 factor が 0 の場合、
Dim rate As Double = value / factor のところで、 0 で割り算していることになります。
結果として rate は無限になります。

そして、次の行
CInt(Math.Floor(rate) * factor)

カッコの中は無限の小数点以下を切り捨てて 0 を掛け算します。無限×0 となり、もう評価不能で、この結果は数値ではない特別な値 NaN になります。

そうすると数値ではないものを CInt で整数に変換しようとしていることになるのでここれでOverflowExceptionの例外が発生します。

簡略化すると次のプログラムのような状況です。
Dim mugen As Double = 1 / 0
Dim nan As Double = mugen * 0
Dim i As Integer = CInt(nan)    '←ここで OverflowException 



RoundMultiple関数の第2引数 factor が どのような場合 0 になるか。
2回目の呼び出し時にこの値は次の計算によって求められています。
40 / 100 * TrackBar1.Value

TrackBar1.Value が 小さいときこの計算結果は 1 以下の小数になります。
しかし、RoundMultiple関数の第2引数 factor は Integer 、つまり整数で待ち構えているので、小数をそのまま渡すことはできません。
そこで、呼び出し時に四捨五入のような丸めが行われ、0.5以下の場合、0 にされてしまいます。

具体的には TrackBar1.Valueが 0 または 1 のときにこれを実行すると factor は 0 になり、OverflowExceptionが発生するというわけです。

TrackBar1.Value が 1 のとき、 40 / 100 * 1 = 0.4 → 丸められて 0 が factor に渡される
TrackBar1.Value が 2 のとき、 40 / 100 * 2 = 0.8 → 丸められて 1 が factor に渡される


このような暗黙の計算は、バグの原因となりやすいので、暗黙の計算に気が付ける Option Strinct On を好むプログラマーも多くいます。 
Option Strict On を使用するには、ファイルの先頭に Option Strict On と記述します。
(プロジェクトレベルの設定ですべてのファイルで On にすることもできます。)

Option Strict On にすると、イヨさんのプログラムの
40 / 100 * TrackBar1.Value
の行は赤い波線が表示されて、何か良くないことがあるということがわかります。