Как округлить двойные до двух десятичных знаков в Java? - PullRequest
62 голосов
/ 19 апреля 2011

Это то, что я сделал, чтобы округлить двойные до двух десятичных знаков:

amount = roundTwoDecimals(amount);

public double roundTwoDecimals(double d) {
    DecimalFormat twoDForm = new DecimalFormat("#.##");
    return Double.valueOf(twoDForm.format(d));
}

Это прекрасно работает, если сумма = 25,3569 или что-то в этом роде, но если сумма = 25,00 или сумма = 25,0, то я получаю 25,0! То, что я хочу, это и округление, и форматирование до 2 десятичных знаков.

Ответы [ 20 ]

51 голосов
/ 12 июня 2013

Просто используйте: (просто как пирог)

double number = 651.5176515121351;

number = Math.round(number * 100);
number = number/100;

Выход будет 651,52

19 голосов
/ 19 апреля 2011

Ты работаешь с деньгами? Создание String и последующее его преобразование довольно зациклено.

Используйте BigDecimal. Это обсуждалось довольно широко. У вас должен быть класс Money, а сумма должна быть BigDecimal.

Даже если вы не работаете с деньгами, рассмотрите BigDecimal.

19 голосов
/ 19 апреля 2011

Используйте заполнитель цифр (0), как в случае с '#', трейлинг / лидирующие нули показываются как отсутствующие:

DecimalFormat twoDForm = new DecimalFormat("#.00");
10 голосов
/ 19 апреля 2011

Вы не можете «округлить двойное до [любого количества] десятичных разрядов», потому что у двойников нет десятичных разрядов. Вы можете преобразовать double в строку Base-10 с N десятичными разрядами, потому что Base-10 имеет десятичные разряды, но когда вы конвертируете ее обратно, вы вернетесь в двойную землю с двоичными дробными местами.

5 голосов
/ 03 августа 2015

Используйте это

String.format ("%. 2f", doubleValue) // измените 2, согласно вашему требованию.

5 голосов
/ 20 января 2014

Это самое простое, что я могу сделать, но это делает работу намного проще, чем большинство примеров, которые я видел.

    double total = 1.4563;

    total = Math.round(total * 100);

    System.out.println(total / 100);

Результат - 1,46.

4 голосов
/ 13 июня 2013

Вы можете использовать org.apache.commons.math.util.MathUtils из apache common

double round = MathUtils.round(double1, 2, BigDecimal.ROUND_HALF_DOWN);

2 голосов
/ 25 марта 2016

Вы можете использовать Apache Commons Math:

Precision.round(double x, int scale)

source: http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/util/Precision.html#round(double,%20int)

1 голос
/ 05 декабря 2011

Ваш класс Money может быть представлен как подкласс Long или иметь члена, представляющего денежную стоимость как нативный long.Затем при назначении значений для ваших денежных экземпляров вы всегда будете хранить значения, которые на самом деле являются РЕАЛЬНЫМИ денежными значениями.Вы просто выводите свой объект Money (через переопределенный метод toString () вашего Money) с соответствующим форматированием.например, $ 1,25 во внутреннем представлении объекта Money равно 125. Вы представляете деньги в виде центов, или пенсов или любого другого минимального номинала в валюте, с которой вы печатаете, - это ... затем форматируйте их на выходе.Нет, вы НИКОГДА не можете хранить «незаконную» денежную стоимость, как, скажем, $ 1,257.

1 голос
/ 04 ноября 2014

двойная сумма = 25,00;

NumberFormat formatter = new DecimalFormat ("# 0.00");

System.out.println (formatter.format (сумма));

...