黑马程序员技术交流社区

标题: 今天遇到的一个小问题??? [打印本页]

作者: miao1991    时间: 2015-10-7 21:43
标题: 今天遇到的一个小问题???
byte b = 3 + 7;//此语句是编译通过的,是因为有常量优化机制,
float f = 23 + 23.3;//此语句是编译报错的,请问为什么呢?
??????????


作者: kamo    时间: 2015-10-7 21:43
     我来解释下,这个其实是jvm的事。jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(byte,char,short)会进行判断,如果此int型数值超过数值类型(byte,char,short),那么会直接编译出错,但是如果此int型数值尚在将要数值类型(byte,char,short)范围内,jvm会自定进行一次隐式类型转换. 这就是第一句没错的原因。而第二句出错,其它同学也解释了。就是double转float 不能自动转换。
   希望对你有所帮助。
作者: 妳的微笑❤    时间: 2015-10-7 22:04
public static void main(String[] args){
                        float f = 23 + 23.3f;
                        System.out.println(f);
                }
}

这样好像就可以了 后面需要加一个f
作者: mars314    时间: 2015-10-7 22:27
23.3默认为double类型,转为float会丢失精度,所以编译报错的,
作者: 王强0925    时间: 2015-10-7 22:48
float类型的数据,在数值后面需要加一个f或者F.long后面要加L或l.
作者: miao1991    时间: 2015-10-7 23:20
妳的微笑❤ 发表于 2015-10-7 22:04
public static void main(String[] args){
                        float f = 23 + 23.3f;
                        System.out.println(f);

为什么byte b = 3 + 7;就可以,而float f = 23 + 23.3;后面不加f就不行呢???????????????
作者: miao1991    时间: 2015-10-7 23:23
mars314 发表于 2015-10-7 22:27
23.3默认为double类型,转为float会丢失精度,所以编译报错的,

byte b = 3 + 7;
float f = 23 + 23.3;

23.3默认为double类型,转为float会丢失精度,
那7默认也是int类型,3 + 7赋值给byte类型的b,为什么可以呢?不报错呢??????
作者: qiyueios    时间: 2015-10-8 00:04
可能跟默认转换 有关系,你看一下图是不是能解决你的问题

byte是会转换成int的但是double貌似不能默认转换为float

作者: fmi110    时间: 2015-10-8 15:58
miao1991 发表于 2015-10-7 23:23
byte b = 3 + 7;
float f = 23 + 23.3;

那这么想 byte b = 3; 3是整形,为什么能赋值呢?
其实所谓对于整形的数字常量 1 128  3......等数据不能简单的认为是int 型,对于这些数字常量java是通过检查
其大小来判断,如果等号右边的数字溢出,就认为是byte 可以赋值
不信 你试试   byte b = 128; 这个是要报错的 溢出了  认为不是byte型
作者: silentCat    时间: 2015-10-8 17:01
数据在运算时要保持精度;
从低精度向高精度转换byte 、short、int、long、float、double、char;
从高精度到低精度要强转;
即23.3f
作者: DarkHorseFly    时间: 2015-10-8 18:40
常量优化机制是对于byte,short,char,int。你那里23是默认int,而23.3默认double.所以会报错
作者: tang1008    时间: 2015-10-8 19:55
byte b = 3 + 7;
float f = 23 + 23.3;
因为23.3是duble类型,要转成float类型就是向下转型,会丢失精度;而int型转成字节,是向上转型,先升级在转,这与java的默认转换不冲突。所以不报错。
作者: mars314    时间: 2015-10-9 20:28
mars314 发表于 2015-10-7 22:27
23.3默认为double类型,转为float会丢失精度,所以编译报错的,

哈哈,这两天上网时少。看到你的问题已解了。恭喜。
作者: Brisingr    时间: 2015-10-9 20:47
原来还有这么一个地反。。

作者: 人大常务委员    时间: 2015-10-15 20:41
前几天也在纠结着个吻题 先在这么多人给了答案 。。。。谢谢
作者: qi8215686    时间: 2015-10-23 22:43
23.3是浮点数啊你应该加个f
作者: xingui66    时间: 2015-11-4 21:49
jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(byte,char,short)会进行判断,如果此int型数值超过数值类型(byte,char,short),那么会直接编译出错,但是如果此int型数值尚在将要数值类型(byte,char,short)范围内,jvm会自定进行一次隐式类型转换.
第二句出错,是因为double转float 不能自动转换。
作者: ly631960324    时间: 2015-11-15 00:26
        byte b = 3 + 7;在java中存在隐式转换,这就是其中之一的体现;
3 +7 计算后的结果为int类型(整数默认是int类型)的10,而byte雷雨的范围在-128——127之间,10在范围内,所以允许将int类型的10赋值给byte类型的变量b。
        float f = 23 + 23.3;
浮点型数默认是double类型,整数默认是int类型,23 + 23.3 ,23先提升为double类型23.0,再与double类型的23.3相加,结果认为double类型,将double类型的值赋给float类型的值会有精度的损失,所以会报错

作者: 1191065242    时间: 2016-5-1 19:16
float f = (float) (23 + 23.3);  
//23.3是double类型如果进行运算他会自动升级成double类型,所以你后面想使用    float类型只能强转
System.out.println(f);




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