`
zranye
  • 浏览: 25754 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于JAVA的NaN

    博客分类:
  • JAVA
阅读更多

      今天去百度搜索的时候,碰到一位发scjp考证问题的网友,进去看了一下。原来是考断言机制assert。但是令人费解的是,这位网友问的是Float.NaN是what,才想起,好像我也没见过呢。转了一圈csdn,高手还是很多的,大概知道了一点点关于NaN的知识,这里记录一下,毕竟这好像比较少用到,以后可能就google不了了,得提前准备一下。

(注意,double中的NaN类似)

 

      在帮助文档中,NaN是这样解释的(double的,和float差不多):

      <!-- Generated by javadoc (build 1.6.0-beta2) on Mon Mar 19 18:22:44 CST 2007 -->

<noscript></noscript>
public static final double NaN
保存 double 类型的 NaN 值的常量。它等于 Double.longBitsToDouble(0x7ff8000000000000L) 返回的值。

我是这样解释的(理解不深,有错请不吝赐教):

NaN--Not-a-Number,其实是指一个不合理的实数,在合法却不合理的情况下避免你的程序出现Exception。

      NaN什么也不是,如果理解成一个超越了float范围的常量(或者double),那也是不对的,为什么?试试判断(NaN==NaN)吧,你会发现这返回了一个false。这在java底层是怎么做到的呢?最直接的方式是看java源代码咯。

 /**
     * A constant holding a Not-a-Number (NaN) value of type
     * <code>float</code>.  It is equivalent to the value returned by
     * <code>Float.intBitsToFloat(0x7fc00000)</code>.
     */
    public static final float NaN = 0.0f / 0.0f;

上面这一段,就是floa的NaN定义了。这并不是一个超出了范围的常量,而是java的Float中人为得制造出来的一个合法但是不合理的实数了(看来那位仁兄说得基本都对了)。所以,NaN==NaN永远等于false啦。

     那用什么来判断是否合理的Number呢?很奇怪的是,java提供了一个isNaN()的方法,指是否是一个不合理的实数。是否很拗口?我在javascript中第一次接触这个东西,也觉得很奇怪。

     为什么有这样一个判断的方法不把NaN设置成private的,却又对外开放?难道担心我们不能主动制造一个不合理的实数出来?本人菜鸟,如果有高手能解答,还请不吝赐教,理解未深,有错误请指出,谢谢。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics