我知道精度损失错误的出现是因为:非强制性,将一个“高精度”的值,赋值给一个“低精度”的变量。以下我列出了4种情况:
(有精度损失错误,我简写为‘有’,否则写‘无)
情况1:
short a = 1;
a = a + 2;//有情况2:
short a = 1;
short b = a + 1;//有情况3:
short a = 1;
a += 2;//无情况4:
short a = 2 + 1;//无

解决方案 »

  1.   

    short a = 1;
    a += 2;//无
    等同于
    short a = 1;
    a = (short)(a+2);
    即跟你的情况4是等同的
      

  2.   

    你的意思是说:情况4等价于short a = (short)(1 + 2);吗?
    若此,
    short a = 2;
    short b = a + 2;为什么还是会报错!!!!
      

  3.   

    short a = 2;
    short b = a + 2;
    //a+2是int(整数默认就是int的,带小数点默认就是double的),赋值给short属于向下转型,必须要强制转换
    short a = 1;
    a += 2;//无
    //编译器自动给你加上了强制转型
    情况4:
    short a = 2 + 1;//无
    //这个其实就是short a=3,当然不会错
      

  4.   

    嗯,这可以理解。
    那么,请问下,Java中,在运算过程当中,据你所知,出了+=类型外,还有什么运算会是强制转化
    的呢?
      

  5.   

    额,这些和+=是同一个类型。
    我刚才试了下,自增1也是强制转型的。
    比如:
    short a = 2;
    a ++;
    是不会报错的。
      

  6.   

    嗯,我昨天面试的时候就遇上了。
    我只知道
    short a = 1;
    a = a + 2;
    会因为int向short转型而报错。
    以为a += 2;是等价于 a = a + 2;的。O(∩_∩)O~对了,我是第一次发帖子的。
    帖子里有40分,点击“对我有用”只能给1分。
    有什么办法可以给更多分吗?
      

  7.   

    short a = 1;
    a = a + 2;//有
    ps:a+2---->int 类型的,这儿有表达式类型的提升。
       将int ---》short 。情况2:
    short a = 1;
    short b = a + 1;//有
    ps:理由同上。
    情况3:
    short a = 1;
    a += 2;//无
    a=(short)(a+2);
     这个进行了强制转换,不会丢失精度。
    情况4:
    short a = 2 + 1;//无
    ps:这个相当于short a=3;初始赋值在short表示的范围内。不会丢失精度。
      

  8.   

    short a = 2 + 1;//无,这个是初始赋值,表达式里面全是字面常量值,就会把它当做short类型来赋值,
    但是当short a = b+ 1 (b为一个short时),这时就会多一个表达式类型的提升的情况,b 为short ,1为INT,结果为 b+1 为INT 类型, int ---》short 这时就需要强制类型的转换了。
      

  9.   

    嗯,谢谢!这个表达式类型提升的情况我清楚了,相同的情况还会出现在float型运算提为double.
    那么,据你所知,是否还有其它类似于"+="的运算(*=、-=不算),会出现强制转型?
      

  10.   

    a=a+1时等号右边的值自然变为int型,而a申明的是short,这条语句在eclipse中是语法错误,必须要加强制转换,而a+=1则没有变为int型的过程,所以不存在精度损失问题。
      

  11.   

    这个就与Java的语言规范有关了,
    eg.+= 这样的形式:
    short b=+1<====>short b=(short)(b+1);会将右边的值自动转为与左边类型一样的值.
    因此这样的写法应该少用.因此这样写的时候不会报错.
    如果用 short b=b+1,这样写的话 ,就少了一个转型,因此就会报错.