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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

byte b = 10; 这里10是int型的,但是系统会判断10在不在byte的范围内,如果在,这样赋值是可以的.那为什么  float f = 1.0; 这里1.0是double型的,但是1.0应该也在float范围内吧,既然上面的都可以那样写
那下面的为什么 非得写成 float f = 1.0f呢? 难道它就不能判断?是什么原因呢?不要说是规定,就算是规定
也肯定是会有原因的吧!

16 个回复

正序浏览
hlll 中级黑马 2016-12-11 09:00:12
16#
应该是因为在计算机中,小数本来就不能精确的被表示,所以float,double都是一一对应的精度,所以系统无法判断吧?
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
hlll 中级黑马 2016-12-5 23:11:30
15#
回复 使用道具 举报
受教了,就是byte取值范围不应是-128到127吗,下面的12是什么鬼
回复 使用道具 举报
会损失精度
回复 使用道具 举报
6666666666
回复 使用道具 举报
系统判断如果10在byte范围内,不会损失精度。而将double型转化为float型就有可能损失精度。
回复 使用道具 举报
因为他有小数点,有小数点就回复杂化,因为补位0会舍弃,小数点会占位,你不知道他会随哪个0舍弃,系统也怕,所以必须加,不加就报错
回复 使用道具 举报
小的运算的时候会自动转换成大的   但大的变成小的就需要强转了
回复 使用道具 举报
jingyarufeng 来自手机 中级黑马 2016-9-22 14:27:36
8#
查了好多的资料。现在基本上有了答案。大概的意思int型的在符合byte的取值范围内时,把前面多余的零掰掉就可以了。,而float和double在底层的二进制存储形式不同。而且还有好几种存储方式。所以要这样做很麻烦,而且还要告诉人家你要用哪种方式进行存储。还有浮点数也无法精确的表示一个数。当你要掰的时候必然有可能会损失精度。所以说有单精度和双精度之所。不是表示的数的大小不同,而是两种小数的精确度不同。所以,我们还是要从精确度的方面而不是从取值范围去看float和double的区别。这就是我的理解。希望也可以帮到大家。好像以前也问过这个问题,而且也知道了答案。但是时间长了就忘了。。。所以大家要是有什么问题就算有了答案还是记录下来的好。以免遗忘。谢谢大家的热情回复

点评

说的对啊。我也觉得可能存储方式就有区别。而且强制转换还存在精度问题  发表于 2016-9-22 17:16
回复 使用道具 举报
猴哥 来自手机 初级黑马 2016-9-20 00:48:47
7#
整数的常量优化机制,可能是浮点类型的数优化起来比较复杂,所以底层就没有对它进行优化。
回复 使用道具 举报
jingyarufeng 发表于 2016-9-20 00:16
应该是因为某种机制制约了不可以这样做,但是好想知道为什么....

应该是整形是按每个二进制的位转化为十进制,可以直接砍掉前面的一长串零来进行数据类型往低了转,浮点型是以每个二进制位为次幂做的浮点运算,这个可能必须强转了,自动优化直接转可能会出错
回复 使用道具 举报
haoge349 发表于 2016-9-19 23:59
不同的底层数据类型ba

应该是因为某种机制制约了不可以这样做,但是好想知道为什么....
回复 使用道具 举报
不同的底层数据类型ba
回复 使用道具 举报
O-P龚 发表于 2016-9-19 23:16
等号左边的 b 和 f 都是变量名,不是强制转换符,double 数据赋值给folat 不加转换符当然不行. ...

12的默认类型不是int 型? int型赋值给byte型需要强转吧!
回复 使用道具 举报
等号左边的 b 和 f 都是变量名,不是强制转换符,double 数据赋值给folat 不加转换符当然不行.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马