5

decimal を double にキャストするときに奇妙な問題が発生しています。

次のコードは true を返します。

Math.Round(0.010000000312312m, 2) == 0.01m //true

ただし、これを double にキャストすると、false が返されます。

(double)Math.Round(0.010000000312312m, 2) == (double)0.01m //false

Math.Pow を使用したいときにこの問題が発生し、10 進数の Math.Pow オーバーロードがないため、10 進数を double にキャストする必要がありました。

これは文書化された動作ですか? decimal を double にキャストする必要がある場合、どうすれば回避できますか?

Visual Studio のスクリーンショット:

Visual Studio のスクリーンショット

Math.Round をキャストして、次の結果を 2 倍にします。

(double)Math.Round(0.010000000312312m, 2)   0.0099999997764825821   double
(double)0.01m   0.01    double

アップデート

わかりました、私は次のように問題を再現しています:

  1. WPF アプリケーションを実行し、開始直後にウォッチで出力を確認すると、空のプロジェクトのように true になります。
  2. スライダーから計算アルゴリズムに値を送るアプリケーションの一部があります。間違った結果が得られ、計算方法にブレークポイントを設定しました。ここで、ウォッチ ウィンドウで値を確認すると、false になります (何も変更せずに、ウォッチ ウィンドウを更新するだけです)。
  3. いくつかの小さなプロジェクトで問題を再現したらすぐに、ここに投稿します。

更新2

残念ながら、小規模なプロジェクトで問題を再現することはできません。エリックの答えがその理由を説明していると思います。

4

2 に答える 2