Округление чисел с учетом всех цифр - PullRequest
0 голосов
/ 02 июля 2019

В коде Java у меня есть 1 вход: 16275.874999999998

Я строю метод, который округляет его до: 16275,87

Но правильный ответ: 16275,88

Как это исправить в Java?

Мой текущий метод округления:

public static double round(final double value, final int places) {
    if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = BigDecimal.valueOf(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}

Редактировать: я думал, что «правильный ответ» имел .88, потому что 9-е округлились бы, но это не так с методом, который я использую, обязательно рассмотрим его переписку с учетом предыдущих десятичных точек.

Большое спасибо за ответы всем!

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Если вы хотите всегда округлять, тогда вам нужно использовать RoundingMode.CEILING или RoundingMode.UP (в зависимости от того, как вы хотите, чтобы отрицательные числа вели себя), вместо RoundingMode.HALF_UP

    bd = bd.setScale(places, RoundingMode.CEILING);

HALF_UP округляется до любого числа с 5 или более в первом десятичном знаке, который сбрасывается, и округляется до любого значения меньше 5 в этой позиции.

CEILING и UP всегда округляются для получения положительных чисел, поэтому 16275,871 округляется до 16275,88. Разница между ними заключается в том, как они обрабатывают отрицательные числа. CEILING округляет в сторону положительных чисел, а UP округляет в сторону большего отрицательного числа.

CEILING of -16275.871 = -16275.871
UP of -16275.871 = -16275.88
1 голос
/ 02 июля 2019

Java на самом деле правильно округляет ваше число. Поскольку вы округляете до 2 разрядов, метод setScale просматривает третье десятичное число, которое в вашем примере равно 4. Так как 4 <5, ваш режим округления HALF_UP будет вести себя как ROUND_DOWN, поэтому вы получите 16275,87 вместо 16275,88 </p>

Чтобы ваше число округлилось до 16275,88, вам нужно запустить метод с вводом как round(round(16275.874999999998, 3), 2)

...