Мне нужны следующие результаты
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
или .setScale()
? Как мне это сделать?
Мне нужны следующие результаты
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
обратной строки в строку. Он дает"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()); }
Вывод:
источник
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
Я протестировал остальные ваши примеры, и он возвращает требуемые значения, но я не гарантирую его правильность.
источник
Вы хотите
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
источник
round
: «Если параметр точности равен 0, округление не производится».