18

私が行った場合

double d = 0;
if (d == 0) {
  ...
}

Resharperは、d == 0「浮動小数点数と等式演算子の比較。値の丸め中に精度が低下する可能性がある」という比較について不満を述べています。

なんで?正確なゼロをダブルまたはフロートとして表すのは難しいことではありませんか?

正確なバイナリ表現がない0.2などの他の値と比較した場合、このような警告が関連することを理解しています。

4

3 に答える 3

12

Resharperは、double変数がどのようにその値を取得したかを分析しません。

数回の計算の後、double値が正確になることはめったにないため、resharperは、doubleを正確な値と比較することはお勧めできません。

double x = Math.Sqrt(2);
double d = x * x;

Console.WriteLine(d == 2);
于 2012-05-21T11:36:40.277 に答える
10

R#6以降、このような検査の多くには「ReSharperがこれを示唆しているのはなぜですか?」Alt+Enterメニューの項目。この場合、説明は、浮動小数点値で等式比較を行うことによって発生する可能性のある意図しない結果に関連しています

演算子を使用して==浮動小数点数を比較することは、一般的に悪い考えです。この問題は、通常、計算結果を浮動小数点表現に「適合」させる必要があるという事実から生じます。浮動小数点表現は、どの結果生成するかという認識された現実と常に一致するとは限りません。

于 2012-05-21T11:50:38.790 に答える
4

多くの場合、doubleを使用した計算は不正確です。doubleを正確な値と比較すると問題が発生する可能性があります。インターバルと比較すると、より安全になる可能性があります。

if ((d > -0.000001) && (d < +0.000001)) {
   ...
}

日付を比較するときにも同じことが当てはまります

if ((date >= DateTime.parse("2012-05-21T00:00:00")) && 
   (date <= DateTime.parse("2012-05-21T23:59:59"))) {
}
于 2012-05-21T11:38:47.163 に答える