Подтвердить что ты не робот

Почему Resharper жалуется, когда я сравниваю double с нолем?

Если я делаю

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

Resharper жалуется на сравнение d == 0 "Сравнение числа с плавающей запятой с оператором равенства. Возможная потеря точности при округлении значений".

Почему? Не может быть сложно представить точный нуль в виде двойника или поплавка?

Я понимаю, что такое предупреждение было бы актуальным, если бы я сравнил какое-то другое значение, такое как 0.2, для которого нет точного двоичного представления.

4b9b3361

Ответ 1

Resharper не анализирует, как двойная переменная получила свое значение.

После нескольких вычислений двойное значение редко бывает точным, поэтому resharper предупреждает вас, что сравнение двойника с точным значением не является хорошей идеей.

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

Console.WriteLine(d == 2);

Ответ 2

Поскольку R # 6, во многих таких проверках есть "Почему ReSharper предлагает это?" пункт в меню Alt + Enter. В этом случае объяснение связано с возможными непреднамеренными последствиями выполнения сравнений сравнений с плавающей запятой:

Использование оператора == для сравнения чисел с плавающей запятой, как правило, плохая идея. Проблема возникает из-за того, что, как правило, результаты вычислений должны быть "установлены в плавающие точки представление, которое не всегда соответствует воспринимаемой реальности какой результат должен быть произведен.

Ответ 3

часто вычисление с двойным неточно. сравнение двойного с точным значением может быть проблематичным. Сравнение с interwallmight будет более безопасным.

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

то же самое при сравнении дат

if ((date >= DateTime.parse("2012-05-21T00:00:00")) && 
   (date <= DateTime.parse("2012-05-21T23:59:59"))) {
}