Даже используя BigDecimal у меня есть проблемы с округлением

Почему, если я использую BigDecimal в этом случае, я не получаю ожидаемый результат?

double value1 = 5.68;
double value2 = 2.45;
System.out.println(BigDecimal.valueOf(value1 + value2));

ВЫВОД:

8.129999999999999

ОЖИДАЕМЫЙ:

8.13
13
задан 16.12.2015, 17:25
3 ответа

То, что он перемещает, состоит в том, что ты делаешь сумму 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() в Вашем месте

15
ответ дан 24.11.2019, 15:06
  • 1
    Хотя это будет функционировать, объяснять точно из-за qu и # 233; он мне кажется достаточным количеством м и # 225; s dif и # 237; cil, что использовать String: BigDecimal.valueOf("5.68").add(BigDecimal.valueOf("2.45")). – Peter Taylor 16.12.2015, 19:05

Когда ты используешь 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, что позволяет выбирать способ округления.

4
ответ дан 24.11.2019, 15:06

Так как вопрос - на округлении используя 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.

1
ответ дан 24.11.2019, 15:06

Теги

Похожие вопросы