将double比较为0是不对的:doubleVariable == 0?

时间:2011-04-14 05:05:25

标签: c# double

可以这样做吗?

double doubleVariable=0.0;
if (doubleVariable==0) {
   ...
}

或者这段代码会遇到潜在的舍入问题?

6 个答案:

答案 0 :(得分:7)

如果您只是与0进行比较,那么它是完全合法的,因为比较的右侧将自动转换为加倍。另一方面,如果您要与== 0.10000001

进行比较,它会产生所有舍入误差

你最好还是在这里阅读关于float to 0比较的讨论:Is it safe to check floating point values for equality to 0?

此讨论对于浮点数的奇怪精度问题非常有用:Why the result is different for this problem?

即。以下将产生错误:

double d1 = 1.000001; double d2 =0.000001;
Console.WriteLine((d1-d2)==1.0);

答案 1 :(得分:3)

你所拥有的是0,它是一个整数字面值。它隐式转换为双精度,您可以用双文字0.0implicit conversion)表示。然后是两个双打之间的比较。舍入错误可能导致doubleVariable不等于0.0(通过其他一些数学运算,而不仅仅是设置它),但是在将整数0转换为double时,永远不会出现舍入错误。你在那里的代码是完全安全的,但我赞成== 0.0代替。

答案 2 :(得分:2)

尝试:

if (double.Equals(doubleValue, 0.0)){}

答案 3 :(得分:1)

如果你只是将一个双变量与0.0(或0)进行比较,我相信这样做是安全的,因为我认为0可以用浮​​点表示,但我不是100%肯定。 / p>

通常,建议的比较浮点数的方法是选择一个“delta”值,如果它们的差值小于delta,你可以认为两个双倍值是相等的。这处理浮点数的精确表示限制。

double first = 1.234;
double second = 1.2345;
double difference = Math.Abs(first - second);

double threshold = 0.000001; // doubles are equal if their difference is less than this value - you choose this value based on your needs
bool areEqual = difference < threshold;

答案 4 :(得分:1)

嗯......我认为只要数字具有精确的二进制分数表示(如0),比较就完全有效。

答案 5 :(得分:0)

你不应该使用double进行这样的比较。   双重造成问题。
例如double n1=0.55 double n2=100然后double ans=n1*n2应为55.0
但是当你调试ans时55.000000000000007if(ans==55.0)
将失败。在这种情况下,你可能会遇到问题。