在java中Float源码中static public boolean isNaN(float v) { return (v != v); }方法,v != v是什么意思?
这么久的老问题了, 还没采纳, 对于这种提问但不采纳的问题其实根本不想回复,,, 不过作为自己梳理和对于其他同样有这个疑问可能看到的这个提问的人的参考, 还是可以简单说下自己的理解:
java的Float里面定义了一个NaN字段,其值就是0.0f/0.0f ;
这个值本身比较特殊,它表示的是一个非数值的状态或者说类型, 这个值不等于任何值,包括它自己(大致可以理解为NaN与NaN之间是同类,虽然我们是同类但是我不是你,更深层的原因我觉得可能是每个NaN都会分配一个单独的地址来放, 所以导致NaN==NaN的时候比较内存地址一定会返回false,也就是NaN!=NaN的时候一定是true).
除此之外, 还有一些别的特殊之处可以参考: Float里面有一个native方法叫: intBitsToFloat(Int),这个方法注解中提到它处理值的时候有两个特殊考虑:
一个就是,实现时考虑了这个值NaN值, 注解原文意思是这个值通过iniBitsToFloat处理出来后会跟自己相等(所以Float对象值是NaN的时候, 使用equals方法比较另一个NaN的变量值时是相等的结果), 并且这里还定义了NaN大于所有其他值(甚至包括比浮点数的正无穷大要大);
第二个,也挺有意思, 就是规定了-0.0f 是小于 0.0f的;
以上两个是native方法实现本身逻辑就已经是这样的事实了(可以称为设计如此吧);
写了半天, 估计看的人还不如字数多,要不后面还是发CSDN吧....
float f = 0.0f/0.0f;
System.out.println(f);//打印NaN
System.out.println(isNaN(f));//true
}
程序上有太难的问题得去google,这是我搜到的答案。
当一个返回值为浮点数的表达式运算时,如果运算时的参数会导致结果是未定义的,比如0.0f/0.0f,再比如负数开平方,那么这个表达式的值就是NaN,意思是这不是一个数。其实查api,Float中有个常量Float.NaN,就是表示这个玩意儿。
* Returns <code>true</code> if the specified number is a
* Not-a-Number (NaN) value, <code>false</code> otherwise.
*
* @param v the value to be tested.
* @return <code>true</code> if the argument is NaN;
* <code>false</code> otherwise.
*/
static public boolean isNaN(float v) {
return (v != v);
}
请看说明,注释中已经说了如果值为NaN则返回true
NaN是什么值请看http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763105e8d3d4f07dd743ca080462482d45f93130a1c187ba0fc7063565f8e99616307ac4c5febf5366537747af1c4969c0f80fbc42773db7b23706d913112c468d8dc3756d654e64de8df0e96c9e74396b9d3a3c82520dd23056df1f19c2a06&p=9c759a46d78c12a052f6d068525c&user=baidu&fm=sc&query=NaN+%B2%CE%CA%FD%CA%C7%CA%B2%C3%B4&qid=b497df310abf133d&p1=1