Java 浮点运算无法按预期工作

Java 浮点运算无法按预期工作,java,variables,math,double,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 如上所示,前两个操作按预期工作,但最后一个操作没有。我想这与变量类型有关,但仍然没有解决问题 你能解释一下

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

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

我想j值是6

1/(1+6)
将为您提供0,考虑
int
并将其赋值为将其双重转换为
0.0

解决方案:将任意值转换为
double

double newden = (double)1/(1+j);

还是不浇铸

double newden =1;
newden /=(1+j);

这是有效的。如果您通过放置
(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

如果不涉及
float/double/long
,java中的算术运算将在
int
中完成。因此,将其中一个arg更改为float/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);
以下代码将起作用:

double newden = 1d/(i+j);
System.out.println(newden);

从:

加宽原语转换(§5.1.2)用于转换或 两个操作数按以下规则的顺序指定:

  • 如果其中一个操作数的类型为double,则另一个操作数将转换为double
  • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float
  • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long
  • 否则,两个操作数都将转换为int类型

1/(1+j)
是一个
int
计算,将给您留下一个
int
结果,
1/den
是一个
double
计算(因为
den
是一个
double
),这将给您留下一个
double
。(只是猜测
j
是一个
int
,因为它在这里表示什么不可见)我猜j是一个整数变量。所以整个表达式
1/(1+j)
也被威胁为整数。您可以将
j
强制转换为加倍以获得预期结果
newden=1/(1+((双)j))
ahhh得到它
j
只是一个计数器。但是如果我声明一个double,为什么
1/(1+j)
是一个int计算呢?好的,谢谢!得到了it@user3540466因为
1
是一个
int
j
,所以计算结果是一个
int
,然后将其分配给
double
。计算的类型决定了输出,而不是指定给的类型。当需要双精度时,为什么要使用浮点?您可以简单地使用
1d/(1+j)
@kaetzacoatl changedMinor correction:“如果不涉及浮点/双精度,java中的算术运算是在int中完成的”-并且没有
long
。由于每个类型<
int
都被提升为int,因此此语句非常准确。即使是
byte+byte
也会生成一个
int
@Turing85,感谢您提出的更改建议。更新了答案。请将文本作为文本而不是图像发布。而且,第一点是误导性的,可能是完全错误的;对两个浮点数的操作不会提升它们,实际上会返回一个浮点数,即使看不见的中间操作可能会在引擎盖下将值转换为双倍值。