复合赋值运算符的Strange Double int加法错误

时间:2014-04-24 12:46:42

标签: java precision

如下所示的简单添加 -

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吗?

3 个答案:

答案 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

     

如果rInteger类型的引用,则取消装箱转化会将r转换为r.intValue()

     

如果rDouble类型的引用,则取消装箱转化会将r转换为r.doubleValue()

compound assignment operators

  

E1 op= E2形式的复合赋值表达式是等效的   到E1 = (T) ((E1) op (E2)),其中TE1的类型,E1除外   仅评估一次。

所以这个

c += a;

变为

c = (int) (c + a);

在这种情况下我们有加法,操作数是promoted

  

如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。

     

如果任一操作数的类型为double,则另一个操作数将转换为double

所以a变为

a.doubleValue();

整个表达式变为

c = (int) ((double) c + a.doubleValue()

现在,如果cInteger,这将无效,因为表达式将是

c = (Integer) (c + b);

在这种情况下c + b是加法和相同的促销规则。

c = (Integer) ((double) c.intValue() + a.doubleValue());

但添加的double值结果无法转换为Integer,因此失败。基本上,不要将复合赋值运算符与包装器(盒装)类型一起使用。