Вычитание У 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....
Примечания :
- результаты этого конструктора могут быть несколько непредсказуемый.
...
НАПРИМЕР :
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