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.00.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,感谢您提出的更改建议。更新了答案。请将文本作为文本而不是图像发布。而且,第一点是误导性的,可能是完全错误的;对两个浮点数的操作不会提升它们,实际上会返回一个浮点数,即使看不见的中间操作可能会在引擎盖下将值转换为双倍值。