黑马程序员技术交流社区

标题: 为何“short a=2;”不报错,而“float b=3.14;”报错 [打印本页]

作者: 礼礼小跑    时间: 2015-1-27 20:35
标题: 为何“short a=2;”不报错,而“float b=3.14;”报错
最近看视频,视频里讲整数默认为int类型,小数默认为double类型。float b=3.14会编译报错,因为3.14默认为double类型,double类型比float类型位数高,高位不能自动转为低位。short a=2,2不是默认为int类型么,为何这个可以编译?求大神解答
作者: 麦兜de篼    时间: 2015-1-27 21:49
因为2在short型的表示范围内吧,所以自动转换了
作者: liuhuan    时间: 2015-1-27 21:51
同意楼上的回答。。
作者: xiaoyi    时间: 2015-1-27 22:01
麦兜de篼 发表于 2015-1-27 21:49
因为2在short型的表示范围内吧,所以自动转换了

那么楼主说3.14也在float范围内
作者: xiaoyi    时间: 2015-1-27 22:04
这是虚拟机的规定,没办法
作者: 麦兜de篼    时间: 2015-1-27 22:11
xiaoyi 发表于 2015-1-27 22:01
那么楼主说3.14也在float范围内

浮点数的话,因为后面的小数不确定,所以直接将double型强转成float虚拟机不处理,我是这样理解的
作者: guiqi225    时间: 2015-1-27 22:22
疯狂Java讲义一书中说这是一种特殊情形,如果直接把一个在byte或short类型的表数范围内的整数值赋给一个byte或short变量,系统会自动把这个整数值当成byte或short类型处理~
作者: 邓士林    时间: 2015-1-27 22:25
先说废话:Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。
解释楼主的问题:
1、为什么[size=11.8181819915771px]float b=3.14;错我们首先看编译结果:错误: 可能损失精度。我们知道默认的浮点数是double类型,之所以这样就是为了保证浮点型的精度的完整性,所以这样导致3.14(JVM认为是double)赋值到float时编译出错。正确方法:float c=3.14f;
2、既然上面的都错了,为什么short b = 2;没有报错。我们知道隐性转换一般都是放宽转换(如byte到int,int到long等,都是小的赋给大的。)但是却有一个例外就是,在赋值转换中, 隐性转换也包含了缩窄基本转换。就是从int到byte,char,short的转换:
比如:
byte b=1;//合法
byte b=128; //非法
char和short都是同理的。
右边必须为int型字面常量,而且值必须能被左边类型表示

作者: 麦兜de篼    时间: 2015-1-27 22:44
麦兜de篼 发表于 2015-1-27 22:11
浮点数的话,因为后面的小数不确定,所以直接将double型强转成float虚拟机不处理,我是这样理解的 ...

是的,把2隐性强转成了short型
作者: 梁小刀11    时间: 2015-1-27 23:23
强制类型转换.
作者: da_chuan    时间: 2015-1-27 23:31
大家都说的好好啊,受教了,:lol
作者: sq_jun    时间: 2015-1-27 23:33
short或者byte如果参与运算的话就自动提升为int了,比如:byte a=1,b=2;        byte c=a+b;  就会报错
作者: 朋好友    时间: 2015-1-28 00:17
可能默认为 double  的内存存储方法与(byte short int long)不同  
作者: 朋好友    时间: 2015-1-28 00:21
朋好友 发表于 2015-1-28 00:17
可能默认为 double  的内存存储方法与(byte short int long)不同

Java中直整型赋值时,四种整形只要在承受长度内就会自动截取前面的字节

而由于double folate比较特殊  必须运算转换所以要加吧


这个问题还是问詹姆斯‘高斯林比较好
作者: mengxiang1993    时间: 2015-1-28 11:01
强制类型转换
作者: 希冀    时间: 2015-1-28 21:03
sq_jun 发表于 2015-1-27 23:33
short或者byte如果参与运算的话就自动提升为int了,比如:byte a=1,b=2;        byte c=a+b;  就会报错 ...

楼主这种情况说的是对的
作者: 希冀    时间: 2015-1-28 21:04
邓士林 发表于 2015-1-27 22:25
先说废话:Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte ...

楼主分析的好全面  学习了  以前就知道用 但是少问了一个为什么
作者: yukuoyuan    时间: 2015-1-28 21:05
你少了个f亲
作者: syfsyf1993    时间: 2015-1-28 21:14
恩恩  赞一楼一个
作者: 我为你着迷    时间: 2015-1-28 21:43
因为2是常量  所以JVM在java的编译时期会检查该常量是否在short类型范围之内 如果在  那么就可以赋值  所以会编译通过 并不会损失精度。
作者: 汝建国    时间: 2015-1-29 11:22
float b=3.14就行了
作者: Rorine    时间: 2015-1-29 16:17
应该是写法错误了,应该写成:float b = 3.14f , float数据类后面要加后缀“f”,long 数据类型后面也要加后缀"l",希望帮到楼主。
作者: hiphopman    时间: 2015-1-29 17:31
我觉得JAVA是对小数点后面的精度判断比较困难
作者: RichardXu    时间: 2015-8-31 10:47
xiaoyi 发表于 2015-1-27 22:01
那么楼主说3.14也在float范围内

楼上说的是对的,3.14确实不在float的范围内,并且也不在double的范围内,float和double都无法表示出准确的3.14,3.14在计算机中是一个无限长度的的二进制。
这有关浮点数在计算机中的的表示方式(原理我无法表达清楚,只能大概说明一个结果,具体大家可以查一查其他资料):
举例子说 0.3 这个数会把double的64位全部占用,如果给予更多的位数一千位数一万位也表示不出来,同理3.14一样,在计算机中小数的表示基本上无法准确的描述出来,一般是只是一个近似值(除了0.5这些比较特殊的例子外),这也是为什么浮点数的比较我们无法使用 == 来进行,而是使用两数之差在一个很小的范围内说明两数字相等。

所以float = 3.14,把一个64位的数转换成32位的数字会损失后面的精度,转换之后两数字就已经不再相等,
double a = 3.14; float b = (float)a; double c = double(b);  if(a == c) //返回的是false可以进行验证。

但是short a = 1;这个确实可以无损的将int型号转换成short类型。
作者: zzy张    时间: 2015-9-18 00:52
3.14f就行了吧?
作者: 奔跑的小红帽    时间: 2015-10-14 11:36
浮点型的高位向低位转换会涉及到精度损失,而int型不存在精度的问题
作者: 信徒的前行    时间: 2015-12-28 03:20
float f=3.14f?
作者: Ing    时间: 2016-3-9 23:47
后面加表F;
作者: 苍凉    时间: 2016-3-22 11:49
强制转换一下
作者: 逆击穹霄    时间: 2016-4-23 23:08
学习学习
作者: 大漠沙粒    时间: 2017-5-19 12:07
那么问题来了,为什么int a=1;int b=2; short c=a+b;会报错,显示损失精度;按照道理说(a
作者: 大漠沙粒    时间: 2017-5-19 12:08
按照道理说(a+b)应该转化为int型的3,应该可以啊
作者: 大漠沙粒    时间: 2017-5-19 12:10
邓士林 发表于 2015-1-27 22:25
先说废话:Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte ...

那么问题来了,为什么int a=1;int b=2; short c=a+b;会报错,显示损失精度;按照道理说(a+b)应该转化为int型的3,应该可以啊;回复了,请转发到我邮箱1904505316@qq.com 受教了




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