Почему, если я использую BigDecimal
в этом случае, я не получаю ожидаемый результат?
double value1 = 5.68;
double value2 = 2.45;
System.out.println(BigDecimal.valueOf(value1 + value2));
8.129999999999999
8.13
То, что он перемещает, состоит в том, что ты делаешь сумму double
не из BigDecimal
, я рекомендую это Тебе в Вашем месте
double value1 = 5.68;
double value2 = 2.45;
System.out.println(BigDecimal.valueOf(value1).add(BigDecimal.valueOf(value2)));
Из этой формы каждый nГєmero он превращен первый в один BigDecimal
перед тем, как реализовывать сумму. Такой
Как оператор +
не функционирует с BigDecimal
нужно использовать mГ©todo .add()
в Вашем месте
Когда ты используешь BigDecimal
, годится использовать всегда строители и методы, которые не использовали бы тип double
, так как, поскольку я предполагаю уже, ты знаешь, тип double
у него нет точных представлений для многих чисел, у которых есть точное представление в основании 10.
Для твоего примера, ты мог бы использовать:
/* Usa valueOf(long valorSinEscalar, int escala) */
long value1 = 568;
long value2 = 245;
System.out.println(BigDecimal.valueOf(value1 + value2, 2));
или возможно:
/* Usa el constructor BigDecimal(long valorSinEscalar, int escala) */
BigDecimal value1 = BigDecimal.valueOf(568, 2);
BigDecimal value2 = BigDecimal.valueOf(245, 2);
System.out.println(value1.add(value2));
или будьте другим:
/* Usa el constructor BigDecimal(String valor) */
BigDecimal value1 = new BigDecimal("5.68");
BigDecimal value2 = new BigDecimal("2.45");
System.out.println(value1.add(value2));
Ощутитесь, что есть версия этих строителей с добавочным параметром MathContext
, что позволяет выбирать способ округления.
Так как вопрос - на округлении используя BigDecimal
, только ты должен использовать метод BigDecimal#setScale(int, RoundingMode)
:
System.out.println(BigDecimal.valueOf(value1 + value2).setScale(2, RoundingMode.HALF_EVEN));
Результат будет:
8.13
Ты можешь видеть пример этого прокручивая изображение в окне в ideone.
Очевидно, он не значит, что это способ вести себя с десятичными операциями. Лучшее состояло бы в том, чтобы следовать примеру предложенный в ответе @ninjalj, где, если ты будешь использовать десятичные числа, ты инициализировал BigDecimal
используя цепи вместо double
:
/* Usa el constructor BigDecimal(String valor) */
BigDecimal value1 = new BigDecimal("5.68");
BigDecimal value2 = new BigDecimal("2.45");
System.out.println(value1.add(value2));
В любом случае, если у операций наверху должно быть установленное число десятичных, используй setScale
.
String
:BigDecimal.valueOf("5.68").add(BigDecimal.valueOf("2.45"))
. – Peter Taylor 16.12.2015, 19:05