Java:BigDecimal和Double.NaN

Java:BigDecimal和Double.NaN,java,math,numbers,bigdecimal,Java,Math,Numbers,Bigdecimal,我正在尝试执行以下代码: 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

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

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)    
线程“main”java.lang.NumberFormatException中的异常 在java.math.BigDecimal.(BigDecimal.java:470) 在java.math.BigDecimal.(BigDecimal.java:739) 位于java.math.BigDecimal.valueOf(BigDecimal.java:1069) 位于HelloWorld.main(HelloWorld.java:6)
有没有办法用BigDecimal表示Double.NaN?

NaN=不是数字。它不是一个数字,因此无法根据文档将其转换为BigDecimal,这是不可能的,请参阅

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


BigDecimal.valueOf(Double.NaN)
它试图将
Double.NaN
转换为
BigDecimal
,结果是数字无法转换为
BigDecimal
,即
java.lang.NumberFormatException
您可以这样重写代码:

 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);
 }
有没有办法用BigDecimal表示Double.NaN

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

您可以考虑使用<代码> null <代码>…除了需要至少3个不同的

null
值来表示3种可能的情况之外,这是不可能的

可以考虑创建一个子类“代码> BigDecimal <代码>来处理这些“特殊”值,但是将您的“数字”实现为<代码> BigDecimal < /代码>的包装可能更简单,并将<代码>楠< /代码>等视为特殊情况;e、 g

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
}

BigDecimal是一个对象。也许你只是把它当作空的?合理的建议。“合理的建议”。。。在你考虑双负无穷大和绝对正无穷大的情况下,如果你使用<代码> BigDigial.ValueOf(D)< /C>,你可以坚持双打。