Почему Resharper жалуется, когда я сравниваю double с нолем?
Если я делаю
double d = 0;
if (d == 0) {
...
}
Resharper жалуется на сравнение d == 0
"Сравнение числа с плавающей запятой с оператором равенства. Возможная потеря точности при округлении значений".
Почему? Не может быть сложно представить точный нуль в виде двойника или поплавка?
Я понимаю, что такое предупреждение было бы актуальным, если бы я сравнил какое-то другое значение, такое как 0.2, для которого нет точного двоичного представления.
Ответы
Ответ 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"))) {
}