Java: BigDecimal and Double.NaN



我正在尝试执行以下代码:

import java.math.*;
public class HelloWorld{
     public static void main(String []args){
            System.out.println(BigDecimal.valueOf(Double.NaN));
     }
}

合理地,我得到:

Exception in thread "main" java.lang.NumberFormatException                                                    
    at java.math.BigDecimal.<init>(BigDecimal.java:470)                                                   
    at java.math.BigDecimal.<init>(BigDecimal.java:739)                                                   
    at java.math.BigDecimal.valueOf(BigDecimal.java:1069)                                                 
    at HelloWorld.main(HelloWorld.java:6)    

有没有办法在BigDecimal中表示Double.NaN

有没有办法在BigDecimal中表示Double.NaN?

不。 BigDecimal类不提供 NaN、+∞ 或 -∞ 的表示形式。

您可以考虑使用null...除了您至少需要1 个三个不同的值来表示 NaN、+∞ 或 -∞,而这在 null 中是不可能的。

您可以考虑创建一个处理这些"特殊"值的BigDecimal子类。

你可以考虑将你的"数字"实现为BigDecimal的包装器,并将NaN等视为特例;例如

public class MyNumber {
    private BigDecimal value;
    private boolean isNaN;
    ...
    private MyNumber(BigDecimal value, boolean isNaN) {
        this.value = value;
        this.isNaN = isNan;
    }
    public MyNumber multiply(MyNumber other) {
        if (this.isNaN || other.isNaN) {
            return new MyNumber(null, true);
        } else {
            return new MyNumber(this.value.multiply(other.value), false);
        }
    }
    // etcetera
}

(以上仅供说明。 我会以不同的方式实现它。

<小时 />

1 - IEEE 754 规范还定义了正浮点零点值和负浮点零值,并且有多个 NaN 值。 可以使用Float.floatToRawIntBitsDouble.doubleToRawLongBits方法区分这些方法。

"

NaN"代表"不是一个数字"。如果浮点数,则产生"Nan" 操作具有一些导致操作的输入参数 产生一些未定义的结果。例如,0.0 除以 0.0 为 算术上未定义。取负数的平方根 也是未定义的。

BigDecimal.valueOf(Double.NaN) 它试图将Double.NaN转换为BigDecimal,结果是数字无法转换为BigDecimaljava.lang.NumberFormatException .

根据文档,这是不可能的,请参阅 http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29

NaN = 不是一个数字。它不是一个数字,所以它不能转换为大十进制

你可以像这样重写你的代码:

 public static void main(String []args){
     Double d = ...;
     String value; 
     if (Double.isNaN(d) ==  true) {
         value= "My-NaN-formatting";
     } else {
         value=BigDecimal.valueOf(d);
     }
     System.out.println(value);
 }

最新更新