为什么Java+=
会得到错误的结果,如何防止此问题?(例如,warning
在IDE中以任何方式显示吗?)
我尝试了eclipse和IntelliJ,但均未显示任何警告。
样例代码:
{
long a = 20000000000000000L;
double b = 90.0;
a += b;
System.out.println(a); // 20000000000000088 NG
}
{
long a = 10000000000000000L;
double b = 90.0;
a += b;
System.out.println(a); // 10000000000000090 OK
}
{
long a = 20000000000000000L;
double b = 90.0;
a += (long) b;
System.out.println(a); // 20000000000000090 OK
}
根据JLS,此复合赋值表达式
a += b;
相当于
a = (long) (a + b);
由于b
是double
,所以二进制数值提升在加法发生之前发生。两个操作数都转换为double
值,并且加法运算采用浮点运算。
该值20000000000000090
不能精确地表示为a double
,因此您会失去精度,20000000000000088
取而代之。然后将其转换回long
具有足够精度以表示的20000000000000088
。
您的第二个代码段产生的10000000000000090
结果可以完全表示为double
。
您的第三个片段相当于
a = (long) (a + (long) b);
使用整数算术。20000000000000090
可以表示为long
。
我不知道有任何工具可以警告您。
有关的:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句