簡體   English   中英

Java:BigDecimal和Double.NaN

[英]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 ...除了您需要至少3個不同的null值來表示3種可能的情況,這是不可能的。

您可以考慮創建一個處理這些“特殊”值的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
}

“NaN”代表“不是數字”。 如果浮點運算有一些輸入參數導致操作產生一些未定義的結果,則會產生“Nan”。 例如,0.0除以0.0是算術上未定義的。 取負數的平方根也是不確定的。

BigDecimal.valueOf(Double.NaN)它試圖將Double.NaN轉換為BigDecimal ,結果是數字無法轉換為BigDecimaljava.lang.NumberFormatException

NaN =不是數字。 它不是一個數字,所以它不能轉換為BigDecimal

您可以像這樣重寫代碼:

 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);
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM