标题: 关于报错精度损失问题 [打印本页] 作者: 弘一 时间: 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;
编译则通过。
因为参与运算的是常量,编译器会先计算值,在看该值是否是左边能够表示的范围。
如果是,就不报错。