2015-09-13 2 views
6

Я хочу вычитать 2 double значений, и я пробовал следующий код.BigDecimal Вычитание

double val1 = 2.0; 
double val2 = 1.10; 

System.out.println(val1 - val2); 

, и я получил результат, как,

0.8999999999999999 

Для получения вывода, как 0.9 я попытался с BigDecimal следующим образом,

BigDecimal val1BD = new BigDecimal(val1); 
BigDecimal val2BD = new BigDecimal(val2); 

System.out.println(val1BD.subtract(val2BD)); 

И я получил результат, как,

0.899999999999999911182158029987476766109466552734375 

Затем я попытался с BigDecimal.valueOf()

val1BD = BigDecimal.valueOf(val1); 
val2BD = BigDecimal.valueOf(val2); 

System.out.println(val1BD.subtract(val2BD)); 

И, наконец, я получил выход в 0.9.

Мой вопрос в чем разница между случаем 2 & кейс 3?

В случае 2, почему я получил выход так?

ответ

6

BigDecimal.valueOf(double d) использует каноническое String представление двойного значения, внутренне Double.toString(double) используется, поэтому вы получаете 0.9 во втором случае.

Примечание: Это, как правило, предпочтительный способ преобразовать двойной (или поплавка) в BigDecimal, а возвращаемое значение равно этому в результате построения BigDecimal из результата с помощью Double.toString(double) ,

В то время как с new BigDecimal(0.9) он преобразует значение к точным с плавающей точкой представления группы double значение без использования String представления,

Переводит двойной в BigDecimal, который является точным десятичной представления бинарных дубля значение с плавающей запятой.

...

ПРИМЕЧАНИЯ:

  1. Результаты этого конструктора может быть несколько непредсказуемым.

...

НАПРИМЕР:

BigDecimal bd1 = new BigDecimal(Double.toString(0.9)); 
BigDecimal bd2 = new BigDecimal(0.9); 
System.out.println(bd1); 
System.out.println(bd2); 

ВЫВОД:

0.9 
0.90000000000000002220446049250313080847263336181640625 
+2

Может стоит упомянуть, что лучший способ инициализировать 'BigDecimal' это из' String' или 'символ []'. Когда у вас есть «double», ошибка округления уже сделана. Преобразование обратно в 'String' может или не может отменить эту ошибку. Математически точное двойное значение является лучшим выбором, если вы заинтересованы в точности. – Henry