Мені потрібні наступні результати
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
чи .setScale()
? Як я можу це зробити?
Відповіді:
Можна використовувати setScale()
для зменшення кількості дробових цифр до нуля. Припускаючи, що value
має значення, яке потрібно округлити:
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
Використання round()
трохи більше задіяне, оскільки вимагає вказати кількість цифр, які слід зберегти. У ваших прикладах це буде 3, але це не справедливо для всіх значень:
BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);
(Зверніть увагу, що BigDecimal
об’єкти незмінні; обидва setScale
і round
повернуть новий об’єкт.)
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
друкує помилково
RoundingMode
що це? ЦеBigDecimal
Якщо я піду на відповідь Гродрігеса
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
Це вихід
100.23 -> 100
100.77 -> 101
Що не зовсім те, що я хочу, тому в підсумку я зробив це ..
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
Це я отримую
100.23 -> 100.00
100.77 -> 101.00
Наразі це вирішує мою проблему ..:) Дякую всім.
DecimalFormat
(як і в new DecimalFormat("###.00")
) для управління перетворенням BigDecimal
back у рядок. Це дає "101.00"
результат для обох значень, які створили фрагменти від @Grodriquez.
Ось надзвичайно складне рішення, але воно працює:
public static BigDecimal roundBigDecimal(final BigDecimal input){
return input.round(
new MathContext(
input.toBigInteger().toString().length(),
RoundingMode.HALF_UP
)
);
}
Код тесту:
List<BigDecimal> bigDecimals =
Arrays.asList(new BigDecimal("100.12"),
new BigDecimal("100.44"),
new BigDecimal("100.50"),
new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
System.out.println(roundBigDecimal(bd).toPlainString());
}
Вихід:
100
100
101
101
input.toBigInteger().toString().length()
частина була б набагато ефективнішою, використовуючи логарифм, щось на кшталтround_up(log(input)) + (1 if input is a power of ten, else 0)
Просто подивіться на:
http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP
і:
setScale(int precision, int roundingMode)
Або якщо ви використовуєте Java 6, тоді
http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html#HALF_UP
http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html
і будь-який:
setScale(int precision, RoundingMode mode);
round(MathContext mc);
Я не думаю, що ти можеш округлити це так за одну команду. Спробуйте
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(new BigDecimal("100.12"));
list.add(new BigDecimal("100.44"));
list.add(new BigDecimal("100.50"));
list.add(new BigDecimal("100.75"));
for (BigDecimal bd : list){
System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
}
Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
Я протестував для решти ваших прикладів, і він повертає шукані значення, але я не гарантую його правильність.