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? Это было бы логично ...

EDIT: ОК, так что это очень старая ошибка:

Bug Link

и на самом деле, она «работает» для любого количества нулей: new BigDecimal("0.0000").stripTrailingZeroes().scale() это 4!

+1

Возможный дубликат [Разъяснение по поведению BigDecimal.stripTrailingZeroes()] (http://stackoverflow.com/questions/5239137/clarification-on-behavior-of-bigdecimal-striptrailingzeroes) –

+2

Вопрос, на который ссылается Эндрю, это действительно то же самое, но имейте в виду, что принятый ответ неверен. Поведение, которое вы видите, это ошибка, упомянутая в другом ответе: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6480539 – jarnbjo

ответ

8

Фактически «0,0» - это исключение, так как оно не содержит stripTrailingZeroes. Ошибка!

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 

Исправлено в Java 8! См. Комментарий @ vadim_shb.

+4

Это известная ошибка: http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=6480539 –

+1

@AaronDigulla lol, ошибка с 2006 года. И будет исправлена ​​только в 'Java 8'. – Andremoniy

+3

@Andremoniy: Не рассчитывайте на это ;-) –

Смежные вопросы