如下所示的简单添加 -
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 bug吗?
答案 0 :(得分:3)
这不是错误。您正在为int
赋值,因此忽略小数点后的任何内容。
1.4278175434624698E9
与:
相同1427817543.4624698
所以变成:
1427817543
将其分配到int
答案 1 :(得分:1)
值正确,因为int不能包含小数。
当你执行c + = b时,b首先转换为整数,因为int和double是可转换类型。整数和双精度不可转换,你会收到错误。
请注意,您应该始终使用BigDecimal来计算Java中的十进制值,否则您可能会得到一些奇怪的结果。
答案 2 :(得分:1)
您是否对unboxing conversion感到困惑?
从类型
Integer
到类型int
从类型
Double
到类型double
如果
r
是Integer
类型的引用,则取消装箱转化会将r
转换为r.intValue()
如果
r
是Double
类型的引用,则取消装箱转化会将r
转换为r.doubleValue()
compound assignment operators?
E1 op= E2
形式的复合赋值表达式是等效的 到E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,E1
除外 仅评估一次。
所以这个
c += a;
变为
c = (int) (c + a);
在这种情况下我们有加法,操作数是promoted。
如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。
如果任一操作数的类型为
double
,则另一个操作数将转换为double
。
所以a
变为
a.doubleValue();
整个表达式变为
c = (int) ((double) c + a.doubleValue()
现在,如果c
是Integer
,这将无效,因为表达式将是
c = (Integer) (c + b);
在这种情况下c + b
是加法和相同的促销规则。
c = (Integer) ((double) c.intValue() + a.doubleValue());
但添加的double
值结果无法转换为Integer
,因此失败。基本上,不要将复合赋值运算符与包装器(盒装)类型一起使用。