黑马程序员技术交流社区

标题: 这句话为何会提示损失精度啊???求解答 [打印本页]

作者: Imp_x    时间: 2014-7-23 09:35
标题: 这句话为何会提示损失精度啊???求解答
class Test
{
        public static void main(String[] args)
        {
                byte b=1,c=2;
                byte a=b+c;   //这句话为何会提示损失精度??难道b、c相加会先自动变为int类型??可是a、b、c不都是byte类型吗?等号两边类型一样应该不会自动转换类型吧??
                System.out.println("a="+a);
        }
}

作者: DarkSky    时间: 2014-7-23 09:54
就和你说的,虽然吧b,c声明是byte型,但是(b+c )在内部默认就是int型,赋值给byte型,当然损失精度。。需要强转。
作者: Imp_x    时间: 2014-7-23 10:00
DarkSky 发表于 2014-7-23 09:54
就和你说的,虽然吧b,c声明是byte型,但是(b+c )在内部默认就是int型,赋值给byte型,当然损失精度。。 ...

那不是每次把b+c的值赋给a都需要这样byte a=(byte)(b+c);
如果这样的话,声不声明b、c是byte型都无所谓了吧...那声明b、c不是多余了....
作者: dreamseekerkun    时间: 2014-7-23 10:02
a+b会自动转换成Int型,所以应该是(byte)(a+b),java中有个晋升现象,低于Int的 byte short char运算相加时会自动提升为Int型,所以高转低应该强制转换。
作者: OCTSJimmy    时间: 2014-7-23 10:06
这里存在一种情况来着啊:
byte b=127,c=10;
byte a = b + c;

如果加法运算不是int类型的,这不就已经损失精度了么?所以四则运算都是int类型的。
所以 必需:
byte a = (byte)(b+c); //因为b+c太大了,超过了byte的上限了,所以最后会变成负数……
作者: DarkSky    时间: 2014-7-23 10:12
Imp_x 发表于 2014-7-23 10:00
那不是每次把b+c的值赋给a都需要这样byte a=(byte)(b+c);
如果这样的话,声不声明b、c是byte型都无所谓了 ...

这个嘛,你要用b+c的和已经赋值给a了,以后想再赋值给其他变量直接拿a来用就好了。你要真要每次都算b+c
那就定义个方法,每次调用这个方法就行了。
作者: tc庄稼汉    时间: 2014-7-23 10:26
OCTSJimmy 发表于 2014-7-23 10:06
这里存在一种情况来着啊:
byte b=127,c=10;
byte a = b + c;

比较赞同这一个:lol
作者: space2007    时间: 2014-7-23 11:13
网上搜到的问题解答 希望对你有帮助

byte b=4;
byte b1=3;
byte b2=7;
b=b1+b2;      //这样是计算不出b,是错误的
b=b1+7;        //这样也是计算不出b
byte b=3+7;  //怎么这样又可以计算?

求解啊。。
非常感谢大家的回答,以下有了详细的介绍,希望有跟我一样不理解的也能看到:

//b = 3+7;
  /*
  b取值范围:-128~127
  编译器在编译时(byte类型取值是有限的)他在判断右边的数值的时候发现是int类型(是“常量”), 但他会判断是不是在byte字节范围之内,如果在的话,会给右边的int类型做默认的强转,他把最后的一个字节(byte八个二进制)赋值到了b这个变量当中
  */

/*
  b1和b2是“变量”意味着这两值不确定、可能随时变化,编译器无法检查,也无法确定是否在byte字节范围之内, 他检查不了就会报错(可能丢失精度),如果是“常量”编译器就能够判断了

  int x;
  int x1=Integer.MAX_VALUE;
  int x2=2;
  x=x1+x2;
  默认int运算,一旦超出这个范围,他自动底层有强制转换过程,保留自己原有位置、高位全舍弃  这就是byte和int的区别,int属于默认类型,他就没有byte上面那样的问题
  */
  
  //byte和short类型“变量”,相加不能确定结果,无法检查,也不是默认类型,所以byte、short类型相加的时候,都会自动提升到int类型的
作者: 编程学徙    时间: 2014-7-23 14:35
在计算中,byte,short,char都会自动转换成int.这个老师讲过的。把一个int型的值赋给byte变量,的确会损失精度。大概就是这样。。
作者: Imp_x    时间: 2014-7-24 20:30
space2007 发表于 2014-7-23 11:13
网上搜到的问题解答 希望对你有帮助

byte b=4;

好的 谢谢!!
作者: doubandddk    时间: 2014-7-24 20:36
java脑残的设计,你就接受了吧
作者: fantacyleo    时间: 2014-7-24 20:58
你说对了,计算b+c时,b和c会先被提升为int,因此b+c的类型是int。而当赋值=右边不是常量表达式时,是不会自动向下强转的,因此=左右类型不匹配,报错
作者: 刘一阳    时间: 2014-7-24 21:53
默认类型是int 在进行算术运算的时候 会强制转换为int
作者: 南柯一梦    时间: 2014-7-24 22:30
b和c都是变量,当a=b+c时,因为b+c值大小不确定,为避免丢失精度,会自动把b+c的和转为int类型,所以会提示丢失精度
作者: zll0214    时间: 2014-7-25 00:32
你说对了,byte类型数值相加,会自动转换为int类型,int类型复制给byte类型就会造成损失精度了
作者: wisely    时间: 2014-7-25 03:12
童鞋们,不带这样儿的。

咳咳!

问题出在打印语句上。System.out是PrintStream型,println是它的方法,这个方法的重载形式中,根本没有byte型的参数,byte型写入后,会被认为是int型。

赋值语句没错……
作者: 沿途小将    时间: 2014-8-14 08:00
OCTSJimmy 发表于 2014-7-23 10:06
这里存在一种情况来着啊:
byte b=127,c=10;
byte a = b + c;

这个给力
作者: 沿途小将    时间: 2014-8-14 08:02
space2007 发表于 2014-7-23 11:13
网上搜到的问题解答 希望对你有帮助

byte b=4;

这个就水了你那个
  1. b=b1+7;
复制代码

7就是int 类型的啊
作者: 沿途小将    时间: 2014-8-14 08:04
刘一阳 发表于 2014-7-24 21:53
默认类型是int 在进行算术运算的时候 会强制转换为int

我是不是可以认为在java中的所有运算都是在不低于int类型下运算?
作者: 董帅军    时间: 2014-8-14 08:36
感谢楼主,学习了
作者: happymouse    时间: 2014-8-14 09:04
没发出来,写的时候还真不好注意到




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