可以这样做吗?
double doubleVariable=0.0;
if (doubleVariable==0) {
...
}
或者这段代码会遇到潜在的舍入问题?
答案 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.0
(implicit 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.000000000000007
。
if(ans==55.0)
将失败。在这种情况下,你可能会遇到问题。