黑马程序员技术交流社区

标题: 关于报错精度损失问题 [打印本页]

作者: 弘一    时间: 2013-12-8 16:55
标题: 关于报错精度损失问题
class Test
{
        public static void main(String[] args)
       {
             short a = 3;
             short b = 4;
             short c = a + b;
             System.out.println(c);
      }
}

short c = a + b;为何相同的数据类型错精度损失

作者: Weix1992    时间: 2013-12-8 17:00
因为这个时候a+b 编译器认为是int类型的  (short)(a+b)就可以解决了
作者: 343475709    时间: 2013-12-8 17:01
short a 和 short b 在参与运算时会自动提升为int类型,所以将int类型赋值给short类型会报错。
作者: 史超    时间: 2013-12-8 17:05
这。。。。如果你想保留精度就必须定义short类型  格式就是:short a = 0.0f; 你定义的a和b编译器会认为是Int类型,你把俩加起来也是Integer类型,所以相加就没有精度
作者: 一个人旅行    时间: 2013-12-8 17:10
因为short c = a+b;默认是int型相加,所以加了以后结果是int,,int到short自然会精度损失。
作者: 赵青超    时间: 2013-12-8 17:11
short在内存中占2个字节,以十六个二进制位表示,范围负的2的15次方到正的2的15次方-1;-32768~32767
内存很小,为避免内存溢出,需要强制转换。
作者: Cola    时间: 2013-12-8 21:12
我觉得是,前边3,4虽然是int,但是是在short范围内的,可以转为short。但是a+b中a和b是变量,虚拟机不能判断a+b的值是否在short范围内,所以报错。
作者: Cheers_for_CRAZ    时间: 2013-12-8 21:53
short,byte,char在进行相加减时,会自动将其类型提升为int型,
也就是说运算结果是int型,这时候你将一个int型赋给short,byte,char
会提示可能损失精度。
作者: litaojisuanji    时间: 2013-12-8 22:14
short c = a + b;
       a+ b在参与运算的时候,首先会自动转换成int类型。
       在这个时候,a和b其实都被提升了类型。
       所以,他们的计算结果也应该是int类型。
        最终,就相当于直接把int类型赋值给byte类型,所以,会有精度的损失。
如果short c = 3 + 4;
      编译则通过。
        因为参与运算的是常量,编译器会先计算值,在看该值是否是左边能够表示的范围。
        如果是,就不报错。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2