2013-02-08 2 views
16

이 간단한 프로그램을 실행 :왜 새로운 BigDecimal ("0.0"). stripTrailingZeros()의 스케일이 1입니까?

public static void main(final String... args) 
{ 
    System.out.println(BigDecimal.ZERO.scale()); 
    System.out.println(new BigDecimal("0").scale()); 
    System.out.println(new BigDecimal("0.0").stripTrailingZeros().scale()); 
    System.out.println(new BigDecimal("1.0").stripTrailingZeros().scale()); 
} 

출력 :

0 
0 
1 
0 

내 질문은 오히려 간단하다 : 왜하지 않습니다 세 번째 println 출력 0? 즉 ... 논리적 인 것 같다

편집 : OK, 그래서 이것은 아주 오래된 버그가 :

Bug Link

사실에

, 제로의 수에 대한 그 "작품" new BigDecimal("0.0000").stripTrailingZeroes().scale() 4입니다!

+1

[BigDecimal.stripTrailingZeroes()의 동작에 대한 설명이 중복 될 수 있습니다. (http://stackoverflow.com/questions/5239137/clarification-on-behavior-of-bigdecimal-striptrailingzeroes) –

+2

Andrew가 연결하는 질문은 참으로 똑같지 만, 받아 들여진 대답이 부정확하다는 것을 알아야합니다. 표시되는 동작은 다른 대답에 언급 된 버그입니다. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6480539 – jarnbjo

답변

8

실제로 "0.0"은 stripTrailingZero가 없으므로 예외입니다. 버그!

public static void main(final String... args) { 
    p("0"); 
    p("0.0"); 
    p("1.0"); 
    p("1.00"); 
    p("1"); 
    p("11.0"); 
} 

private static void p(String s) { 
    BigDecimal stripped = new BigDecimal(s).stripTrailingZeros(); 
    System.out.println(s + " - scale: " + new BigDecimal(s).scale() 
     + "; stripped: " + stripped.toPlainString() + " " + stripped.scale()); 
} 

0 - scale: 0; stripped: 0 0 
0.0 - scale: 1; stripped: 0.0 1 
1.0 - scale: 1; stripped: 1 0 
1.00 - scale: 2; stripped: 1 0 
1 - scale: 0; stripped: 1 0 
11.0 - scale: 1; stripped: 11 0 

자바 8에서 해결!
@ vadim_shb의 의견보기.

+4

알려진 버그 : http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=6480539 –

+1

@AaronDigulla lol, 2006 년부터 버그. 그리고 Java 8에서만 수정 될 예정입니다. – Andremoniy

+3

@Andremoniy : 그것에 의지하지 마십시오 ;-) –