Java:BigDecimal 和 Double.NaN

2022-09-04 07:34:12

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

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


答案 1

有没有办法用BigDecimal来表示Double.NaN?

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

您可以考虑使用...除了您至少需要3个不同的值来表示3种可能的情况,这是不可能的。nullnull

您可以考虑创建一个处理这些“特殊”值的子类,但是将“数字”实现为 的包装器并将其视为特殊情况可能会更简单;例如:BigDecimalBigDecimalNaN

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
}

答案 2

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

BigDecimal.valueOf(Double.NaN)它试图转换为 ,结果是数字不能转换为 即。Double.NaNBigDecimalBigDecimaljava.lang.NumberFormatException