今天,我朋友给我问了一个问题:怎么快速判断一个 double 数是否在另外两个 double 数之间?(说这是个面试题)
java浮点数运算中有两个特殊的情况:NaN、Infinity。
一、Infinity(中文是无穷大的意思)
在浮点数运算时,有时我们会遇到除数为0的情况,那java是如何解决的呢?
我们知道,在整型运算中,除数是不能为0的,否则直接运行异常。但是在浮点数运算中,引入了无限这个概念,我们来看一下Double和Float中的定义。
浮点数中的包装类是这么定义Infinity的:
Float包装类中是这么定义的:
首先要看一下Float包装类继承实现了哪些类?
Double包装类中是这么定义的:
首先要看一下Double包装类继承实现了哪些类?
那么这些值对运算会有什么影响呢?
我们先思考一下下面几个问题:
1.无限乘以0会是什么?
2.无限除以0会是什么?
3.无限除以无限会是什么?
4.无限做除了1、2、3外的运算结果是什么?
- 无限乘以0,结果为NaN
2.无限除以0,结果不变,还是无限
3.无限除以无限,结果为NaN
4.无限做除了乘以0和除以无限以外的运算,结果还是无限
除了这两个操作,其他操作无限的结果都是无限
i == i + 1;这个一般来说是返回false吧,一个数字永远不会等于它自己加1,这是正常的思维,但是我们知道无穷大加一还是无穷大。这也验证了上述的小总结。
事实上,你不必将i 初始化为无穷大以确保返回true。任何足够大的浮点数都可以实现这一目的,例如:
Java中NaN是这么定义的:
NaN表示非数字,它与任何值都不相等,甚至不等于它自己,所以要判断一个数是否为NAN要用isNAN方法:
这个方法源码是这样的:
NaN表示非数字,它与任何值都不相等,甚至不等于自己;
NaN与任何数比较均返回false;
任何浮点操作,只要它的一个或多个操作数为NaN,那么其结果为NaN。
i != i ;一个数字总是等于它自己,一般正常的思维肯定是这样的。但是,浮点算术保留了一个特殊的值用来表示一个不是数字的数量,这个值就是NaN(“不是一个数字(Not a Number)”的缩写),对于所有没有良好的数字定义的浮点计算,例如0.0/0.0,其值都是它。规范中描述道,NaN 不等于任何浮点数值,包括它自身在内。NaN 还有其他的惊人之处。任何浮点操作,只要它的一个或多个操作数为NaN,那么其结果为NaN。
NaN表示非数字,它与任何值都不相等,甚至不等于自己:
最后,我们来看一下这个面试题:
既然我们知道浮点数中有NaN这个数,那么我们在比较前要不要判断下这个数是不是NaN呢,利用包装类中的isNaN方法判断。继而再比较。