像这样将双精度变量与0进行比较是错误的吗?
本文关键字:比较 错误 双精度 变量 像这样 | 更新日期: 2023-09-27 17:50:00
这样做可以吗?
double doubleVariable=0.0;
if (doubleVariable==0) {
...
}
或者这段代码可能会出现舍入问题?
不,如果你只对0进行比较,这是完全合法的,因为比较的右侧会自动转换为double。另一方面,如果与== 0.10000001
进行比较,则会产生所有舍入错误。你最好在这里阅读关于float到0比较的讨论:检查浮点值是否等于0安全吗?
这个讨论对于浮点数上奇怪的精度问题提供了非常有用的信息:为什么这个问题的结果不同?
。下面将返回false:
double d1 = 1.000001; double d2 =0.000001;
Console.WriteLine((d1-d2)==1.0);
这里的是0
,它是一个整数字面值。它被隐式转换为双精度类型,您可以用双精度字面值0.0
表示(隐式转换)。然后是两个double之间的比较。舍入误差可能导致doubleVariable
不等于0.0
(您可以通过其他数学方法,而不仅仅是设置它),但是在将整数0转换为双精度数时永远不会出现舍入误差。你在那里的代码是完全安全的,但我更喜欢== 0.0
。
尝试:
if (double.Equals(doubleValue, 0.0)){}
如果您只是将双变量与0.0(或0)进行比较,我相信这样做是安全的,因为我认为0可以精确地表示为浮点数,但我不是100%确定。
一般来说,比较浮点数的建议方法是选择一个"增量"值,如果两个双精度数的差小于增量,则认为它们相等。这可以处理浮点数的精确表示限制。
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;
嗯…我认为,只要数字具有精确的二进制分数表示(如0),比较是完全有效的。
不应该使用double进行这种比较。Double会产生问题。
例如double n1=0.55
double n2=100
那么double ans=n1*n2
应该是55.0
但当你调试ans是55.000000000000007
。if(ans==55.0)
将会失败。在这种情况下,您可能会遇到问题。