如果我做
double d = 0;
if (d == 0) {
...
}
Resharper 在比较d == 0
中抱怨“浮点数与相等运算符的比较。四舍五入时可能会丢失精度。”
为什么?将精确的零表示为双精度或浮点数并不难,可以吗?
我知道,如果我与没有精确二进制表示的其他值(例如 0.2)进行比较,这样的警告将是相关的。
如果我做
double d = 0;
if (d == 0) {
...
}
Resharper 在比较d == 0
中抱怨“浮点数与相等运算符的比较。四舍五入时可能会丢失精度。”
为什么?将精确的零表示为双精度或浮点数并不难,可以吗?
我知道,如果我与没有精确二进制表示的其他值(例如 0.2)进行比较,这样的警告将是相关的。
Resharper 没有分析 double 变量是如何得到它的值的。
经过几次计算后,double 值很少是精确的,因此 resharper 警告您将 double 值与精确值进行比较不是一个好主意。
double x = Math.Sqrt(2);
double d = x * x;
Console.WriteLine(d == 2);
自 R# 6 以来,许多此类检查都有“为什么 ReSharper 建议这样做?” Alt+Enter 菜单上的项目。在这种情况下,解释涉及对浮点值进行相等比较可能产生的意外后果:
使用
==
运算符比较浮点数通常是个坏主意。问题源于这样一个事实:通常,计算结果必须“拟合”到浮点表示中,这并不总是与应该产生什么结果的感知现实相匹配。
通常用双精度计算是不精确的。将双精度值与精确值进行比较可能会有问题。与间隔比较可能更安全。
if ((d > -0.000001) && (d < +0.000001)) {
...
}
比较日期时同样适用
if ((date >= DateTime.parse("2012-05-21T00:00:00")) &&
(date <= DateTime.parse("2012-05-21T23:59:59"))) {
}