为什么我会收到有关Java中“可能丢失精度”的警告?

时间:2011-05-07 05:57:08

标签: java

class Test
{
    public static void main(String[] args)
    {
         short s=2,s1=200,s2;
         s2=s+s1; // error: "possible loss of precision"
         System.out.println(s2);
    } 
}

为什么将短路添加两个短路的结果分配给编译错误?

5 个答案:

答案 0 :(得分:5)

因为为了对short执行算术运算,编译器会首先将它们扩展为整数:

S2 = s + s1

实际上是

S2 = (int)s +(int)s1

右侧有int类型。

答案 1 :(得分:2)

因为两个短路的总和将被评估为一个int,所以你要为一个短路分配一个int。

你可以简单地解决这个问题:

s2=(short)(s+s1);

答案 2 :(得分:1)

在这种情况下,如果32,767 < s + s1s+s1 < -32,768

,可能会出现溢出

-32,768 - 32,767是一个短变量的可能值范围。

答案 3 :(得分:1)

因为当您指定数字文字时,它默认为整数。编译器不会检查该值以检查精度是否会丢失。

此外,Java将执行整数运算。有关短值的更多信息,请参阅Primitive type 'short' - casting in Java

答案 4 :(得分:0)

这是因为Java使用int来进行小整数运算;在添加之后,Java抱怨由于重新缩短而导致精度损失。

值得注意几件事:

  1. The short data type is rarely useful outside of arrays.

  2. 如果总和涉及您要分配的变量,则可以避免使用+=运算符进行显式强制转换,因为复合算术/赋值运算符都意味着强制转换到原始变量的类型(如果有必要)。