以下简单浮点算术运算未按预期工作。
double den = (1+j);
System.out.println(den);
den = 1/den;
System.out.println(den);
double newden = 1/(1+j);
System.out.println(newden);
上面的代码给出了以下输出。
7.0
0.14285714285714285
0.0
如上所示,前两个操作按预期工作,但最后一个操作不起作用。我想它与变量类型有关,但仍然无法解决问题。
您能否解释一下Java中算术运算的行为?
答案 0 :(得分:8)
如果没有涉及int
,则在float/double/long
中完成java中的算术运算。因此,将其中一个arg更改为float / double并按预期工作。
以下代码可行:
double newden = 1d/(i+j);
System.out.println(newden);
来自java spec:
扩展基元转换(第5.1.2节)用于转换或 以下规则指定的两个操作数,依次为:
- 如果任一操作数的类型为double,则另一个操作数将转换为double。
- 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
- 否则,如果任一操作数的类型为long,则另一个操作数将转换为long。
- 否则,两个操作数都将转换为int。
答案 1 :(得分:3)
这很有效。如果您通过在其中放置(double) 1/(1+j);
来尝试此操作,则可以看到结果:
int j = 1;
double den = (1+j);
System.out.println(den);
den = 1/den;
System.out.println(den);
double newden = (double) 1/(1+j);
System.out.println(newden);
下面, 你的输出将是:
2.0
0.5
0.5
答案 2 :(得分:2)
我猜j值是6所以
1/(1+6)
会在考虑int
的情况下给你0,并指定它将其双重转换为0.0
解决方案:将任何值转换为double
double newden = (double)1/(1+j);
或
double newden = 1.0/(1+j);
或没有施法
double newden =1;
newden /=(1+j);
Read the awesome official doc about narrowing and Widening primitive conversion