关于Doblue.NaN

此篇源于王子兴同学的问题。

以下转自《JAVA解惑》一书 

IEEE 754 浮点算术保留了一个特殊的值用来表示一个不是数字的数量[IEEE 754]。这个值就是 NaN(“不是一个数字(Not a Number)”的缩写),对于所有没有良好的数字定义的浮点计算,例如 0.0/0.0,其值都是它。规范中描述道,NaN 不等于任何浮点数值,包括它自身在内[JLS 15.21.1]。 你可以用任何计算结果为 NaN 的浮点算术表达式来初始化 

 

i,例如: 

double i = 0.0 / 0.0; 

同样,为了表达清晰,你可以使用标准类库提供的常量: 

double i = Double.NaN; 

NaN 还有其他的惊人之处。任何浮点操作,只要它的一个或多个操作数为 NaN,那么其结果为 NaN。这条规则是非常合理的,但是它却具有奇怪的结果。 

 

下面的程序将打印 false: 

public class Test {

public static void main(String[] args) {

double i = 0.0 / 0.0;

System.out.println("i: " + i);//NaN

System.out.println(i - i);//NAN

System.out.println(i + i);//NaN

System.out.println(i - i == 0);//false

}

}

这条计算 NaN 的规则所基于的原理是:一旦一个计算产生了 NaN,它就被损坏了,没有任何更进一步的计算可以修复这样的损坏。NaN 值意图使受损的计算继续执行下去,直到方便处理这种情况的地方为止。 总之,float 和 double 类型都有一个特殊的 NaN 值,用来表示不是数字的数量。对于涉及 NaN 值的计算,其规则很简单也很明智,但是这些规则的结果可能是违背直觉的。

 

 

需要注意的是,像double i = 1/0.0并不会抛出出java.lang.ArithmeticException。

但double i = 1/0;则会抛出ArithmeticException。如下:

Exception in thread "main" java.lang.ArithmeticException: / by zero

at Test.main(Test.java:10)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值