问题描述
|
可以这样做吗?
double doubleVariable=0.0;
if (doubleVariable==0) {
...
}
还是此代码可能会遇到舍入问题?
解决方法
不,如果您只想与0比较,那是完全合法的,因为比较右边会自动转换为double。另一方面,如果您要与== 0.10000001进行比较,则会产生所有舍入误差。
您更好,还是在这里阅读了有关浮点数与0的比较的讨论:检查浮点值是否等于0是否安全?
此外,该讨论还对浮点数上的怪异精度问题非常有用:为什么该问题的结果不同?
即下面将产生假:
double d1 = 1.000001; double d2 =0.000001;
Console.WriteLine((d1-d2)==1.0);
,您所拥有的是0
,这是一个整数文字。它隐式转换为双精度数,您可以用双精度字面量0.0
表示它(隐式转换)。然后是两个双打之间的比较。舍入错误可能会导致doubleVariable
不等于0.0
(通过其他一些数学运算,您可能会做,不仅是对其进行设置),但是将整数0转换为double时永远不会出现舍入错误。您那里的代码是完全安全的,但我宁愿使用== 0.0
。
,尝试:
if (double.Equals(doubleValue,0.0)){}
,如果您只是将double变量与0.0(或0)进行比较,我相信这样做是安全的,因为我认为0可以精确地表示为浮点数,但我不确定100% 。
通常,建议的比较浮点数的方法是选择一个“ delta”值,如果两个double的差小于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;
,嗯...我认为,只要数字具有精确的二进制小数表示形式(如0),比较就完全有效。
,不应将double用于此类比较。
双重制造问题。
例如double n1=0.55
double n2=100
,则double ans=n1*n2
应该是55.0
但是当您调试ans时是55.000000000000007
。
if(ans==55.0)
将失败。在这种情况下,您可能会遇到问题。