Вычитание У Bigdecimal

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

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, Почему я получил такой вывод?

1 ответов


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

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

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

переводит двойник в BigDecimal который является точным десятичным представление двоичного значения с плавающей запятой double.

...

Примечания :

  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