如果我这样做:
double d = 0;
if (d == 0) {
...
}
Resharper在比较d == 0
时报错,提示“使用等于号比较浮点数,可能会丢失精度”。为什么?难道不能用double或float表示精确的零吗?我知道如果我和其他值(如0.2)进行比较,则此警告将是相关的,因为其没有精确的二进制表示。
如果我这样做:
double d = 0;
if (d == 0) {
...
}
Resharper在比较d == 0
时报错,提示“使用等于号比较浮点数,可能会丢失精度”。为什么?难道不能用double或float表示精确的零吗?我知道如果我和其他值(如0.2)进行比较,则此警告将是相关的,因为其没有精确的二进制表示。
Resharper无法分析double变量的值是如何获取的。
在进行一些计算后,double值很少是精确的,因此resharper会警告您比较double与精确值不是一个好主意。
double x = Math.Sqrt(2);
double d = x * x;
Console.WriteLine(d == 2);
自从R# 6版本以来,许多这样的检查在其Alt+Enter菜单上有一个“为什么ReSharper建议这样做?”的选项。 在本例中,解释涉及在浮点值上执行等式比较可能产生意想不到的后果:
使用
==
运算符比较浮点数通常是一个坏主意。问题在于,通常情况下,计算结果必须被“适应”到浮点表示中,而这并不总是与所期望的结果相匹配。
在进行双精度浮点数计算时,结果可能不准确。将双精度浮点数与精确值进行比较可能会出现问题。相比之下,与区间进行比较更加安全。
if ((d > -0.000001) && (d < +0.000001)) {
...
}
if ((date >= DateTime.parse("2012-05-21T00:00:00")) &&
(date <= DateTime.parse("2012-05-21T23:59:59"))) {
}
if (d == 0.0)
会发生什么?这可能更加无用,但是会涉及到双精度浮点数。 - Shegit Brahm