2015-12-22 3 views
6

Я встретил странную ошибку в моем коде.BigDecimal stripTrailingZeros не работает для нуля

Это относится с

new BigDecimal("1.2300").stripTrailingZeros() 

возвращает 1.23 (правильный)

но

new BigDecimal("0.0000").stripTrailingZeros() 

возвращается 0.0000 (странно), при этом ничего не происходит

Почему?

Как это исправить?

+0

Я получаю '0' ... Можете ли вы разместить MVCE? – Tom

+1

Я тоже получаю '0' - JDK 8u66. Какую версию Java вы используете? Что вы подразумеваете под «return 0.0000» - вы имеете в виду 'toString()' печатает его как '0,0000'? –

+0

Я использую java 6u45 – gstackoverflow

ответ

8

Похоже, что это ошибка . Но это исправлено в Java 8. Прямой URL для fix.

Существует обходной путь для этого:

BigDecimal zero = BigDecimal.ZERO; 
if (someBigDecimal.compareTo(zero) == 0) { 
    someBigDecimal = zero; 
} else { 
    someBigDecimal = someBigDecimal.stripTrailingZeros(); 
} 

Пожалуйста, обратитесь к этой link.

Также хороший момент из Holger в комментариях

Не тратьте ресурсы создать свой собственный нулевой экземпляр. Используйте BigDecimal.ZERO.

+0

Почему downvoting? Я столкнулся с подобными проблемами в старой версии jdk. Кстати, в ответ прямая ссылка на эту ошибку. –

+0

Я не могу изменить версию jdk в моем проекте) Есть ли другой способ? – gstackoverflow

+0

@gstackoverflow Если вы не можете обновить версию JDK, вам необходимо выполнить исправление вручную с помощью чего-то вроде этого: 'BigDecimal stripped = blub.intValue() == 0? BigDecimal.ZERO: blub.stripTrailingZeros(); '. – Tom

0

Вот Javadoc для этого метода, который, безусловно, наводит на мысль, что это не соответствует предполагаемому поведение, но не является окончательным: http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#stripTrailingZeros()

Именно поэтому он не делает это вплоть до реализации, то , Какой JDK вы используете? Для OpenJDK мы можем увидеть source, чтобы выяснить, как он достигает этого вывода, но другие JDK могут отличаться.