复合赋值运算符出现奇怪的Double int加法错误



对于如下的简单加法-

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

如果rInteger类型的引用,则开箱转换将r转换为r.intValue()

如果rDouble类型的引用,则开箱转换将r转换为r.doubleValue()

还有复合赋值运算符?

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

所以这个

c += a;

成为

c = (int) (c + a);

在这种情况下,我们进行加法运算,运算数被提升。

如果任何操作数是引用类型,则对其进行开箱转换(§5.1.8)。

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

所以a变成

a.doubleValue();

整个表达式变成

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

现在,如果cInteger,这将不起作用,因为表达式将是

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来计算十进制值,否则可能会得到一些奇怪的结果。

最新更新