2015-01-21 1 views
4

나는 다음과 같은 코드를 실행하려고 :자바 : BigDecimal와 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)  

가 Double.NaN을 표현하는 방법이 있나요 BigDecimal에서?

답변

2

NaN = 숫자가 아닙니다. 그것이 가능하지 않은 문서에 따르면 BigDecimal를

+3

BigDecimal은 개체입니다. 아마도 당신은 단지 그것을 null로 가질 수 있을까요? – Amr

+0

합리적인 제안. –

+2

"합리적인 제안"... Double.NEGATIVE_INFINITY와 Double.POSITIVE_INFINITY를 고려할 때까지 –

3

"NaN의"참조 "숫자가 아닌"를 의미합니다. "Nan"부동 소수점 작업에 일부 입력 매개 변수가있어 에 대한 연산이 정의되지 않은 결과를 생성하는 경우 생성됩니다. 예를 들어 0.0을 0.0으로 나눈 값은 입니다. 음수 인 의 제곱근을 취하는 것은 정의되지 않습니다.

BigDecimal.valueOf(Double.NaN)

그것은 BigDecimalDouble.NaN을 변환하려고하고, 결과는 숫자가 BigDecimaljava.lang.NumberFormatException에 변환 할 수없는 것입니다.

1

이 같은 코드를 다시 작성할 수 있습니다 : BigDecimal의에서가 Double.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); 
} 
+0

'BigDecimal.valueOf (d) '를 사용하면 두 배로 고정 할 수 있습니다. – Axel

7

있습니까?

No. 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 
} 
+1

Booo. :-(NaN 값을 저장할 필요가있을 때 Big의 대체물로 BigDecimal을 사용할 수 없으면 매우 짜증나게됩니다. –