java double除以int_Java十万个为什么之除零问题

大家都知道,除数不能为零,除数为零时,Java会抛出异常。但是,真的如此吗?

废话不多,有面试题如下:

第一题:

System.out.println(1.0 / 0);

A、抛异常

B、Infinity

C、NaN

D、2147483647

第二题:

System.out.println(0.0 / 0.0);

A、抛异常

B、Infinity

C、NaN

D、0.0

第三题:

System.out.println((int) (1.0 / 0));

A、抛异常

B、Infinity

C、NaN

D、2147483647

第四题:

System.out.println((int) (1 / 0));

A、抛异常

B、Infinity

C、NaN

D、2147483647

据说,大多数人都栽到了这几道面试题上。

首先,无论哪一题,大多数人的第一选择,肯定是A,抛出异常。因为脑海里存储着一句话,除数不能为零。那么,答案正确吗?

在运行完这些程序之后,你会发现,真正抛异常的,只有,第四题,前面三道题,根本不会抛异常。第一题,答案为B;第二题,答案为C;第三题,答案为D;第四题,答案为A。

为什么?

凡有疑问的童鞋,应该再回炉,再多看看Java基础。

Java语言规定:

任意整数(byte、short、int、long)除以整数0,会抛出ArithmeticException异常。

0除以浮点0,结果为NaN,包含以下三种情况:

  1. 0 / 0.0
  2. 0.0 / 0.0
  3. 0.0 / 0

其中,情况1和3,虽说被除数、除数是整数0,但是,另外一个操作数是浮点数,根据数据类型转换规则,非浮点数会进行自动类型转换,也转换为浮点数。

任意数(八种数据类型)除以浮点0,结果为 Infinity-Infinity

究其主要原因,还是因为在Java中,浮点0并非真实的0,而是一个无限接近于0的值。而Infinity、-Infinity、NaN正是Java中三个特殊的浮点类型的数值。

另外一个问题,为何强制转换1.0 / 0的结果,值为2147483647?

首先,1.0 / 0,为Infinity,即无穷大,转换为int类型时,由于int占用4个字节,double占用8个字节,无穷大浮点型转换到int型时,会丢失精度,舍弃4个字节的内容,占满int类型4个字节的长度,即int类型的最大值2147483647。

此外,这些特殊的浮点数值之间,并不是都相等。

Float.NaN != Float.NaNDouble.NaN != Double.NaNFloat.POSITIVE_INFINITY == Float.POSITIVE_INFINITYFloat.NEGATIVE_INFINITY == Float.NEGATIVE_INFINITYDouble.POSITIVE_INFINITY == Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY == Double.NEGATIVE_INFINITYFloat.POSITIVE_INFINITY == Double.POSITIVE_INFINITYFloat.NEGATIVE_INFINITY == Double.NEGATIVE_INFINITY

只要掌握了这些基础知识,就不再惧怕此一类问题的面试了。当然了,日常开发过程中,肯定也不会犯相应的错误啦。

c4d67d2ecb60e32d0ae928c05743efac.png
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值