Интересно, что значения кажутся равными, и вычитание дает вам ноль, похоже, это просто проблема с кодом печати. Следующий код:
import java.math.BigDecimal;
public class Test {
public static void main(String args[]) {
BigDecimal b1 = new BigDecimal(0.01);
BigDecimal b2 = new BigDecimal(0.01);
BigDecimal b3 = new BigDecimal(0);
if (b1.compareTo(b2) == 0) System.out.println("equal 1");
b1 = b1.subtract(b2);
if (b1.compareTo(b3) == 0) System.out.println("equal 2");
System.out.println("BigDecimal result: "+ b1);
}
}
выводит оба сообщения equal
, указывая, что значения одинаковы одинаковы и что при вычитании вы получаете ноль.
Вы можете попытаться поднять это как ошибку и посмотреть, что вернется Oracle. Скорее всего, они просто заявят, что 0e-59
по-прежнему равно нулю, так что это не ошибка, или что довольно сложное поведение, описанное в страница документации BigDecimal работает должным образом. В частности, пункт, который гласит:
Существует однозначное соответствие между различимыми значениями BigDecimal и результатом этого преобразования. То есть каждое различимое значение BigDecimal (немасштабированное значение и масштаб) имеет уникальное строковое представление в результате использования toString. Если это строковое представление преобразуется обратно в BigDecimal с помощью конструктора BigDecimal(String), исходное значение будет восстановлено.
Тот факт, что исходное значение должно быть восстанавливаемым, означает, что toString()
необходимо генерировать уникальную строку для каждой шкалы, поэтому вы получаете 0e-59
. В противном случае преобразование строки back в BigDecimal
может дать вам другое значение (кортеж немасштабированного значения/масштаба).
Если вы действительно хотите, чтобы ноль отображался как "0" независимо от масштаба, вы можете использовать что-то вроде:
if (b1.compareTo(BigDecimal.ZERO) == 0) b1 = new BigDecimal(0);
person
paxdiablo
schedule
15.03.2013