Проблема с округлением до ближайшего значения 0,05 - PullRequest
4 голосов
/ 13 июня 2011

Уже уже задано столько вопросов .

Один из популярных ответов - использовать приведенную ниже формулу.

  Math.ceiling(myValue * 20) / 20

Мне нужен следующий вывод для соответствующего ввода.

     16.489 (input)   - 16.49(output)

Используя приведенную выше формулу

     16.489*20  = 329.78

     Math.ceil(329.78) = 330.0

     and 330.0 /20  = 16.5 

но я хочу 16.49.

В идеале материал Math.ceil должен был дать 329,8

Так, как мы можем обойти вышеупомянутый случай? Есть много других подобных случаев.

Ответы [ 5 ]

5 голосов
/ 13 июня 2011

Вместо умножения / деления на 2 * 10, вы должны сделать это с 10 2 .

Однако я предлагаю вам использовать Math.round(100*a) / 100.0, или, если вам это нужно для печати, printf или DecimalFormat.

Примеры:

double input = 16.489;

// Math.round
System.out.println(Math.round(100 * input) / 100.0);

// Decimal format
System.out.println(new DecimalFormat("#.##").format(input));

// printf
System.out.printf("%.2f", input);

выход

16.49
16.49
16.49
2 голосов
/ 13 июня 2011

Почему бы не использовать Math.round () отформатировать ваше значение?

редактировать: Math.round (значение * 100,0) / 100,0;

0 голосов
/ 11 марта 2015

попробуйте

round(16.489, 2, BigDecimal.ROUND_CEILING);

public static double round(double x, int scale, int roundingMethod) {
        try {
            return (new BigDecimal
                   (Double.toString(x))
                   .setScale(scale, roundingMethod))
                   .doubleValue();
        } catch (NumberFormatException ex) {
            if (Double.isInfinite(x)) {
                return x;
            } else {
                return Double.NaN;
            }
        }
    }
0 голосов
/ 13 июня 2011

Округление 16,489 до ближайшего 0,05 - это правильно 16,5, при этом 16,45 является следующим самым низким возможным значением.

Видимое поведение правильное. Если вы хотите округлить до 0,01, тогда

Math.ceiling(myValue * 100) / 100

было бы более подходящим решением.

0 голосов
/ 13 июня 2011

Я думаю, , это поможет вам. По этой ссылке вы узнаете, как округлить число до n-го знака после запятой.

...