A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© miao1991 中级黑马   /  2015-10-7 21:43  /  3675 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

10黑马币
byte b = 3 + 7;//此语句是编译通过的,是因为有常量优化机制,
float f = 23 + 23.3;//此语句是编译报错的,请问为什么呢?
??????????

最佳答案

查看完整内容

我来解释下,这个其实是jvm的事。jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(byte,char,short)会进行判断,如果此int型数值超过数值类型(byte,char,short),那么会直接编译出错,但是如果此int型数值尚在将要数值类型(byte,char,short)范围内,jvm会自定进行一次隐式类型转换. 这就是第一句没错的原因。而第二句出错,其它同学也解释了。就是double转float 不能自动转 ...

18 个回复

倒序浏览
     我来解释下,这个其实是jvm的事。jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(byte,char,short)会进行判断,如果此int型数值超过数值类型(byte,char,short),那么会直接编译出错,但是如果此int型数值尚在将要数值类型(byte,char,short)范围内,jvm会自定进行一次隐式类型转换. 这就是第一句没错的原因。而第二句出错,其它同学也解释了。就是double转float 不能自动转换。
   希望对你有所帮助。

评分

参与人数 1黑马币 +5 收起 理由
miao1991 + 5 赞一个!

查看全部评分

回复 使用道具 举报
public static void main(String[] args){
                        float f = 23 + 23.3f;
                        System.out.println(f);
                }
}

这样好像就可以了 后面需要加一个f

评分

参与人数 1黑马币 +5 收起 理由
miao1991 + 5 赞一个!

查看全部评分

回复 使用道具 举报
23.3默认为double类型,转为float会丢失精度,所以编译报错的,

评分

参与人数 1黑马币 +5 收起 理由
miao1991 + 5 赞一个!

查看全部评分

回复 使用道具 举报
float类型的数据,在数值后面需要加一个f或者F.long后面要加L或l.

评分

参与人数 1黑马币 +5 收起 理由
miao1991 + 5 赞一个!

查看全部评分

回复 使用道具 举报
妳的微笑❤ 发表于 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就不行呢???????????????
回复 使用道具 举报
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,为什么可以呢?不报错呢??????
回复 使用道具 举报
可能跟默认转换 有关系,你看一下图是不是能解决你的问题

byte是会转换成int的但是double貌似不能默认转换为float
回复 使用道具 举报
fmi110 高级黑马 2015-10-8 15:58:58
9#
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型
回复 使用道具 举报
数据在运算时要保持精度;
从低精度向高精度转换byte 、short、int、long、float、double、char;
从高精度到低精度要强转;
即23.3f
回复 使用道具 举报
DarkHorseFly 来自手机 中级黑马 2015-10-8 18:40:28
11#
常量优化机制是对于byte,short,char,int。你那里23是默认int,而23.3默认double.所以会报错
回复 使用道具 举报
byte b = 3 + 7;
float f = 23 + 23.3;
因为23.3是duble类型,要转成float类型就是向下转型,会丢失精度;而int型转成字节,是向上转型,先升级在转,这与java的默认转换不冲突。所以不报错。
回复 使用道具 举报
mars314 发表于 2015-10-7 22:27
23.3默认为double类型,转为float会丢失精度,所以编译报错的,

哈哈,这两天上网时少。看到你的问题已解了。恭喜。
回复 使用道具 举报
原来还有这么一个地反。。
回复 使用道具 举报
前几天也在纠结着个吻题 先在这么多人给了答案 。。。。谢谢
回复 使用道具 举报
23.3是浮点数啊你应该加个f

评分

参与人数 1黑马币 +20 收起 理由
miao1991 + 20 赞一个!

查看全部评分

回复 使用道具 举报
jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(byte,char,short)会进行判断,如果此int型数值超过数值类型(byte,char,short),那么会直接编译出错,但是如果此int型数值尚在将要数值类型(byte,char,short)范围内,jvm会自定进行一次隐式类型转换.
第二句出错,是因为double转float 不能自动转换。

评分

参与人数 1黑马币 +20 收起 理由
miao1991 + 20 赞一个!

查看全部评分

回复 使用道具 举报
        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类型的值会有精度的损失,所以会报错
回复 使用道具 举报
float f = (float) (23 + 23.3);  
//23.3是double类型如果进行运算他会自动升级成double类型,所以你后面想使用    float类型只能强转
System.out.println(f);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马