Я согласен с выбранным ответом, чтобы использовать DecimalFormat
--- или альтернативно BigDecimal
.
Пожалуйста, прочитайте Обновите внизу!
Однако, если вы do хотите округлить двойное значение и получить результат значения double
, вы можете использовать org.apache.commons.math3.util.Precision.round(..)
, как указано выше. Реализация использует BigDecimal
, работает медленно и создает мусор.
Аналогичный, но быстрый и не содержащий мусора метод предоставляется утилитой DoubleRounder
в библиотеке decimal4j:
double a = DoubleRounder.round(2.0/3.0, 3);
double b = DoubleRounder.round(2.0/3.0, 3, RoundingMode.DOWN);
double c = DoubleRounder.round(1000.0d, 17);
double d = DoubleRounder.round(90080070060.1d, 9);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
Будет выводить
0.667
0.666
1000.0
9.00800700601E10
См
https://github.com/tools4j/decimal4j/wiki/DoubleRounder-Utility
Отказ от ответственности: Я участвую в проекте decimal4j.
Обновление:
Как отметил @iaforek, DoubleRounder иногда возвращает нелогичные результаты. Причина в том, что он выполняет математически правильное округление. Например, DoubleRounder.round(256.025d, 2)
будет округлено до 256,02, поскольку двойное значение, представленное как 256,025d, несколько меньше рационального значения 256,025 и, следовательно, будет округлено в меньшую сторону.
Примечания:
- Это поведение очень похоже на поведение конструктора
BigDecimal(double)
(но не на valueOf(double)
, который использует конструктор строк).
- Проблема может быть обойдена с двойным шагом округления до более высокой точности, но это сложно, и я не буду вдаваться в подробности здесь
По этим причинам и всему, что упомянуто в этом посте, я не могу рекомендовать использовать DoubleRounder .