为什么使用Resharper将double与0进行比较时会出现警告?

18

如果我这样做:

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

Resharper在比较d == 0时报错,提示“使用等于号比较浮点数,可能会丢失精度”。为什么?难道不能用double或float表示精确的零吗?我知道如果我和其他值(如0.2)进行比较,则此警告将是相关的,因为其没有精确的二进制表示。


我不知道,但如果你比较if (d == 0.0)会发生什么?这可能更加无用,但是会涉及到双精度浮点数。 - Shegit Brahm
请删除更多无用的标签并添加您的语言。谢谢 - Shegit Brahm
3个回答

12

Resharper无法分析double变量的值是如何获取的。

在进行一些计算后,double值很少是精确的,因此resharper会警告您比较double与精确值不是一个好主意。

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

Console.WriteLine(d == 2);

10

4

在进行双精度浮点数计算时,结果可能不准确。将双精度浮点数与精确值进行比较可能会出现问题。相比之下,与区间进行比较更加安全。

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

相同的原则也适用于比较日期。
if ((date >= DateTime.parse("2012-05-21T00:00:00")) && 
   (date <= DateTime.parse("2012-05-21T23:59:59"))) {
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接