关于Double中的NaN问题

官方解释:

public static final double NaN = 0.0d / 0.0;

一个常量,包含一个类型为double的非数字(NaN)值。它相当于Double.longBitsToDouble返回的值(0x7ff8000000000000L)

起因:

最近在写代码时,因为涉及到计算,当时用了Double作为返回值,后续转成BigDecimal,但在测试过程中,发现有事会报异常:NumberFormatException:Infinite or NaN。

翻阅源码发现:

关于Double中的NaN问题_第1张图片

其中红框部分,是抛出的异常,条件为Double无穷大或NaN,以前对Double的认识停留在浅薄的表面,遇到问题,才发现还有这两种情况。Double提供了判断两种情况的方式,还有其他的判断方法,有兴趣的可以自己查阅。

解决方法:

1.可以用加入对NaN的判断

例:

Double value=...
value==null||value.equals(Double.NaN)?BigDecimal.ZERO:new BigDecimal(value.toString());

2.直接使用BigDecimal接收值 不再使用Double

我采用的是第二种。

此次问题虽然简单,但是也提醒我了:以后涉及小数点计算,能用BigDecimal接收还是用BigDecimal吧。

你可能感兴趣的:(日常,1024程序员节,java)