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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 燕国庆 高级黑马   /  2012-9-22 19:40  /  2679 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 屈俊材 于 2012-9-24 22:59 编辑

class TurnTo
{
        public static void main(String[] args)
        {        
                int a=1;
                float b=2;
                b=a+b;
                System.out.println(b);   为什么此处输出的的3.0儿不是3?   int与float都是占四个字节,为什么自动提升为float型而不是int型那
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 新人提问 大家多多支持哦

查看全部评分

11 个回复

倒序浏览
java的类型转换,这属于隐式类型转换,如果两者的类型不一致,则系统会自动转换为较高类型(取值范围较大)的类型.
回复 使用道具 举报
当我们把一种基本的数据类型变量的值赋给另一种基本类型变量时,就涉及数据转换
下列基本类型会涉及数据转换,不包括逻辑类型和字符类型
将这些类型按精度从低到高排列的顺序为:
byte  short  int  long  float  double
当把级别低的变量的值赋给级别高的变量时,系统会自动完成数据类型的转换
所以,b=a+b的时候,就会把结果自动转换为float
回复 使用道具 举报
精度从高到低:
double-   float-long-int-short(char)-byte

这会是因为float的精度比int高,进行运算的时候int类型会自动转换为高精度的float类型,然后再运算,所得的结果也为float类型,所以输出结果为3.0
回复 使用道具 举报
本帖最后由 andychua 于 2012-9-22 20:01 编辑

class TurnTo
{      
              public static void main(String[] args)         
              {                       
                int a=1;               
                 float b=2;               
                 b=a+b;               
                 System.out.println(b);  // 为什么此处输出的的3.0儿不是3? 那是因为你将计算的结果赋给了b(float型),所以结果应该也是float型的              
                 //若是按照下面将计算的结果再赋给a(int的类型)而不是b,就会得到4
                 a=a+(int)b;
                 System.out.println(a);
                 }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 Leo.Peng 于 2012-9-22 21:46 编辑

class TurnTo
{
         public static void main(String[] args)
        {        
                int a=1;
                 float b=2;
                 b=a+b;//此处中的(a+b)的结果为float型,原因是int型的a和float型的b相加,int型会自动转换成float。如果要打印3(int)。必须要利用强转换类型转换变量b。例如:System.out.println((int)b);
                 System.out.println(b);   
         }
}
回复 使用道具 举报
谢谢大家的指点,偶明白了。{:soso_e142:}
回复 使用道具 举报
张金 中级黑马 2012-9-22 23:59:57
8#
class  TurnTo
{
        public static void main(String[] args)
        {
                int a = 1;
                float b =2;
                b = a+b;
                System.out.print(b);
                                                }
}
在这个程序里,int类型的精度没有float高,当a+b时,就是一个int类型的,和一个float类型的值做运算,根据自动转换的原则,它们的和会自动提升,就是为float类型的,在赋值给一个float类型的容器,当然是没有问题的,所以自然会打印出float类型的3.0就不奇怪了。
再看我们对这个小程序做一些改动:
class  TurnTo
{
        public static void main(String[] args)
        {
                int a = 1;
                float b =2;
                a = a+b;
                System.out.print(b);
                                                }
}
我把赋值的b容器,改成了a,由于a是int类型的,上面我已经说了,a和b的和,是一个float类型的,这样就会损失精度。
所以,这个程序编译不过。报错就是,损失精度:
再看这个:
class  TurnTo
{
        public static void main(String[] args)
        {
                double a = 1;
                float b =2;
                b = a+b;
                System.out.print(b);
                                                }
}
我把a定义为double类型的了,这时,a和b在运算时,就会自动转换为double类型的了,double想要赋值给float类型,自然也会损失精度
所以,同样编译不过。
不知道,通过这三个小程序,有没有更理解一些。
Java数据类型的转换原则

从低精度向高精度转换
byte 、short、int、long、float、double、char
回复 使用道具 举报
张金 发表于 2012-9-22 23:59
class  TurnTo
{
        public static void main(String[] args)

想问一下,char类型的变量它的精度应该排在什么位置,怎么大家说的不一样那!
回复 使用道具 举报
基本数据类型的隐式转换与显示转换,不是根据所占字节的大小来转型的,而是根据精度来转型的.
精度从小到大的顺序为:
byte -> short -> int = char(char参与计算时,会先将字符对应的unicode码转换成int型再参与数学运算.) -> long -> float -> double
回复 使用道具 举报
张金 发表于 2012-9-22 23:59
class  TurnTo
{
        public static void main(String[] args)

"byte 、short、int、long、float、double、char"

char在参与数学运算时,会先转换成一个int型的数据,所以char = int.
回复 使用道具 举报
double ----->float---->long---->int ----->short char--->byte
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马