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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yibo924 中级黑马   /  2014-11-27 22:37  /  2050 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

输出打印5/0会出错,输出打印5.0却得到一个译为无限的英文。为什么呢?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
一情况下0是不可以做除数的,所以5/0不可以,除0异常。
但是在Java中浮点数double和float可以除0,返回无穷大。

点评

谢谢  发表于 2014-11-28 15:05

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
5/0,都是int类型,int计算机可以准确表示出来,所以除数不能为0.
5.0/0,编译器会帮助类型自动提升为double,相当于5.0d/0.0d。。。

浮点数在计算机表示是不精确的,浮点数采用IEEE754格式存。
  float:32位
  1bit(符号位) 8bits(指数位) 23bits(尾数位)
  double:64位
  1bit(符号位) 11bits(指数位) 52bits(尾数位)
具体怎么表示浮点数,自己可以去查资料。

float只能保证小数点后6~7位有效,double是15~16位有效。
所以你不能准确表示一个小数,只能无限接近它。
0.0是不能被精确表示出来,因为小数点后面都是0,并且无穷的,但是不管是float还是double,最多都只能确保小数点后16位是有效地。
所以小数不可能有严格精确地0.0.,只能无限接近它,所以当除数为无限接近0的数时,商是无穷大的。


点评

在论坛里提问,效果就是杠杠的。byte b=3是对的 float b=3.0就会出错,也是因为这个。java能准确判断3的长度,所以发现3能放进8位,就自行去除了二进制32位的高位放到了b里面;但是对浮点型的3.0,java不能准确表示   发表于 2014-11-28 15:29

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
这样啊???
回复 使用道具 举报
kerner 发表于 2014-11-27 23:54
5/0,都是int类型,int计算机可以准确表示出来,所以除数不能为0.
5.0/0,编译器会帮助类型自动提升为doubl ...

float f = 3.0....小数默认为double,double不能自动转化为float,因为会有精度损失,所以你要强转,
float f = (float) 3.0;
或者
float f = 3.0f;
回复 使用道具 举报
{:3_48:}好吓人的头像
回复 使用道具 举报
不是无限,是无穷大返回
回复 使用道具 举报
5/0的话,除数与被除数均为int类型~所以会报除数不为0异常.而5.0/0的话,由于你的被除数是一个duble类型的数据,整个表达式会自动升阶,此时除数0会被自动转为0.0,而JAVA中的double型数据是不精确的,也就是说,此时的0.0表示的不是真正的0.0,而是一个无限接近0.0的数,所以5.0/0也就不会报错了,结果将会得到正无穷大~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马