5

私のプロジェクトには、次のように、2 つの double 値を比較して差が 0 を超えているかどうかを確認するコードがいくつかありました。

if (totValue != 1.0)

Resharper はこれについて不満を述べ、"EPSILON" を使用する必要があることを提案し、そのような定数をコードに追加しました (そうするように求められた場合)。ただし、定数自体を作成したり、その値を提案したりすることはありません。これは良い解決策ですか:

const double EPSILON = double.Epsilon; // see http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx
. . .
if (Math.Abs(totValue - 1.0) > EPSILON)
    compValue = Convert.ToString(totValue*Convert.ToDouble(compValue));

?

アップデート

私はこれを次のように変更しました:

const double EPSILON = 0.001;

...おそらく、典型的な二重値で機能するのに十分な大きさと小ささの両方であると考えています(科学的なものではなく、「これらを2.5個持っている」など)

4

2 に答える 2

1

はい。しかし、浮動小数点を使用しない方がよいでしょう。代わりに使用decimalします。

ただし、何らかの理由で、直接比較しないことに固執する必要がある場合は、たとえばwith (であり、等しいことを意図した値である) に依存doubleしないことを意味します。a-b == 0abdouble

浮動小数点演算は高速ですが、正確ではありません。それを考慮すると、R# は正しいです。

于 2014-06-18T18:21:30.747 に答える