Есть ли способ убрать четно-нечетное правило округления на 5 и округления вверх? - PullRequest
0 голосов
/ 18 октября 2019

Оформление заявки на заказ билетов. Для суммирования я добавил промежуточные итоги, hst и сборы за услуги, а в десятичном виде отразил сумму для итога. Если сумма составляет х.85, она округляется до х.8, но я хочу х.9. Есть ли способ удалить четно-нечетное правило для округления 5 и округления вверх?

Я пробовал BigDecimal, номне кажется, это не сработает.

DecimalFormat df = new DecimalFormat("$#,###.00");

grandTotal = subTotal + hst + serviceFees;
System.out.printf("%-40s%11s\n", "TOTAL:", df.format(grandTotal));

Я ожидаю, что результат округляется до 5, но он просто округляется на основе четно-нечетного правила.

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Вы используете плавающую точку (double), которая является лишь приближением к реальным значениям. Особенно со списком и итогом, у вас всегда будут проблемы, чтобы все сделать правильно. Вы не можете контролировать, является ли сумма 2,35 (фактически никогда) или 2,349999998, последний из которых будет округляться вниз.

Используйте BigDecimal с конструкторами String: new BigDecimal("1.20"), имея дробь 2 десятичных знака.

Имейте в виду, вы должны использовать add/multiply io + / *.

1 голос
/ 18 октября 2019

Вам нужна только одна цифра дроби.

Ваш текущий код округляется правильно, слишком много цифр дроби.

Запрашиваемый режим округления называется HALF UP , который является значением по умолчанию для DecimalFormat и единственным возможным режимом округления для printf(). (Вы также можете использовать формат $#,###.#, если не хотите отображать нули в виде дроби.)

Поэтому вы можете использовать свой десятичный формат просто отлично или даже System.out.printf(), но ограничить количество цифр дроби до 1 :

DecimalFormat df = new DecimalFormat("$#,###.0"); //set MIN and MAX fraction digits to 1
df.setRoundingMode(RoundingMode.HALF_UP);         //default but showing usage if needed

System.out.println(df.format(123454.84d));
System.out.println(df.format(123454.85d));
System.out.printf("$%,.1f", 123454.85d);          //HALF UP rounding the only option

отпечатков:

$123,454.8
$123,454.9
$123,454.9
0 голосов
/ 18 октября 2019

Ребята, я просто переключил тип данных double на тип с плавающей точкой, и это сработало ayyyyy !!!!!!!

...