浮点算术无法按预期工作

时间:2016-10-06 13:00:14

标签: java variables math double

以下简单浮点算术运算未按预期工作。

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中算术运算的行为?

3 个答案:

答案 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