問題

私のVB.NETアプリケーションで奇妙なバグを狩っている間、私はそれを驚くほど困惑した詳細に追跡しました。ここに簡単なテストコードがあります:

 If 0.01 > 0.12 - 0.11 Then Debug.Print("what the hell")
 

0.12-0.11は0.01です...これは比較の左側と等しいです。しかし、私がこれを実行すると、デバッグは "地獄"を出力します。真剣に、何が地獄ですか?これらの数字は等しい。

さらに、私はこのようなサイクルを持っている場合:

 Dim count As Integer = 0
For i As Double = 0.11 to 0.12 Step 0.01
   count += 1
Next
Debug.Print(count)
 

1を出力します。つまり、サイクルは1回だけ実行され、2回実行されます。

驚いたことに、上記の例で0.11、0.12、0.01を0.1、0.2、0.1に変更すると、最初の例では何も印刷されず、2番目の例では2が表示されます。

ここで何が起こっているのですか?私は信じられないほど明白なものを見逃していますか、これは何らかの浮動小数点エラーか何かですか?

  ベストアンサー

これらの問題は、ベース 2 を使用する浮動小数点型を使用しているためです。

そのため、Decimalのようなfixedpoint型が考案されました。あなたのサンプルコードがfixed-point(Decimalを使用)のために再作業された場合、期待される結果が得られます。

     ' Specify Decimal constants and this will worked as anticipated.
    If 0.01D > 0.12D - 0.11D Then Debug.Print("what the hell")

    ' 0.12-0.11 Is 0.01... Which Is equal to the left side of the comparison.
    ' However, when I run this, the debug prints "what the hell"... Because 
    ' seriously, what the hell. These numbers are equal.

    ' Additionally, If I have a cycle Like this

    Dim count As Integer = 0
    For i As Decimal = 0.11D To 0.12D Step 0.01D
        count += 1
    Next

    Debug.Print(count) ' Prints 2
 

  同じタグがついた質問を見る

vb.netcomparisonlogical-operators