对于如下的简单加法-
public class TestAddition {
public static void main(String args[]){
Double a = 1.4278175434624698E9;
Double b = 0.0;
int c = 0;
c += a;
c += b;
System.out.println("Sum is " + c);
}
}
我的输出为总和为1427817543
如果我使用Integer,而不是int,它会巧妙地抛出一个错误,但为此,它不会给出错误,而是产生这个输出。这是一个java错误吗?
这不是一个错误。您正在为int
赋值,因此忽略小数点后的任何内容。
1.4278175434624698E9
与相同
1427817543.4624698
因此变成:
1427817543
当您将其分配给int
时
您对开箱转换感到困惑吗?
从类型
Integer
到类型int
从类型
Double
到类型double
如果
r
是Integer
类型的引用,则开箱转换将r
转换为r.intValue()
如果
r
是Double
类型的引用,则开箱转换将r
转换为r.doubleValue()
还有复合赋值运算符?
形式为
E1 op= E2
的复合赋值表达式是等价的到E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,除了E1
仅评估一次。
所以这个
c += a;
成为
c = (int) (c + a);
在这种情况下,我们进行加法运算,运算数被提升。
如果任何操作数是引用类型,则对其进行开箱转换(§5.1.8)。
如果任一操作数的类型为
double
,则另一个操作数将转换为double
。
所以a
变成
a.doubleValue();
整个表达式变成
c = (int) ((double) c + a.doubleValue()
现在,如果c
是Integer
,这将不起作用,因为表达式将是
c = (Integer) (c + b);
在这种情况下CCD_ 25是加法并且应用与之前相同的促销规则。
c = (Integer) ((double) c.intValue() + a.doubleValue());
但是加法的double
值结果不能转换为Integer
,因此失败。基本上,不要将复合赋值运算符与包装器(装箱)类型一起使用。
该值是正确的,因为int不能包含小数。
当您执行c+=b时,b首先转换为integer,因为int和double是可转换类型。Integer和double是不可转换的,您会得到一个错误。
请注意,在Java中应该始终使用BigDecimal来计算十进制值,否则可能会得到一些奇怪的结果。