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


可以这样做吗?

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

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


2100
2018-04-14 05:05


起源

我觉得很好 - V4Vendetta
只有当你试图通过分割两个整数得到双重结果时才会发生舍入问题 - The Lazy Coder
我不同意。 if(x = 0.1)...有舍入问题。 - Nestor
这是因为0.1没有精确表示为二进制浮点数。十进制类型可能更适合您的需求(x = 0.1M) - Eric Mickelsen
@Eric:我理解这个问题。但我已经看到代码执行x == 0或x == 1我想确保它没问题(因为x是双精度)。 - Nestor


答案:


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

你更好或阅读有关浮动到0比较的讨论: 将浮点值的相等性检查为0是否安全?

关于浮动的奇怪精度问题,这个讨论也非常有用: 为什么这个问题的结果不同?

即以下将产生错误:

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

7
2018-04-14 05:07



怎么样:doubleVariable = 1.0; if(doubleVariable == 1.0)... - Nestor
这显然会产生真实的结果。 1.0是文字,doubleVariable是double,因此比较将返回true。 - Teoman Soygul


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


3
2018-04-14 05:11





尝试:

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

2
2017-09-05 14:50



这个问题已在三年前提出,你的帖子不是很详细。也许您可以通过添加详细信息和概述解决方案来改进您的答案。还请带一个 游览 并看到 怎么回答。 - Unihedron


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

通常,建议的比较浮点数的方法是选择一个“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;

1
2018-04-14 05:16





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


1
2018-04-14 05:26





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


0
2018-04-14 05:19