Potrzebuję następujących wyników
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
czy .setScale()
? Jak mam się do tego zabrać?
Potrzebuję następujących wyników
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
czy .setScale()
? Jak mam się do tego zabrać?
Możesz użyć, setScale()
aby zmniejszyć liczbę cyfr ułamkowych do zera. Zakładając, że value
ma wartość do zaokrąglenia:
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
Używanie round()
jest nieco bardziej skomplikowane, ponieważ wymaga określenia liczby przechowywanych cyfr. W twoich przykładach będzie to 3, ale nie jest to poprawne dla wszystkich wartości:
BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);
(Zauważ, że BigDecimal
obiekty są niezmienne; oba setScale
i round
zwrócą nowy obiekt).
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
drukuje fałszRoundingMode
co to jest? JestBigDecimal
Jeśli pójdę na odpowiedź Grodrigueza
System.out.println("" + value); value = value.setScale(0, BigDecimal.ROUND_HALF_UP); System.out.println("" + value);
To jest wynik
100.23 -> 100 100.77 -> 101
Co nie jest tym, czego chcę, więc w końcu to zrobiłem ...
System.out.println("" + value); value = value.setScale(0, BigDecimal.ROUND_HALF_UP); value = value.setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("" + value);
Oto, co dostaję
100.23 -> 100.00 100.77 -> 101.00
To na razie rozwiązuje mój problem .. :) Dziękuję wszystkim.
źródło
DecimalFormat
(as innew DecimalFormat("###.00")
) do zarządzania konwersją zBigDecimal
powrotem do łańcucha. Daje"101.00"
wynik dla obu wartości utworzonych przez fragmenty z @Grodriquez i przez Ciebie.Oto strasznie skomplikowane rozwiązanie, ale działa:
public static BigDecimal roundBigDecimal(final BigDecimal input){ return input.round( new MathContext( input.toBigInteger().toString().length(), RoundingMode.HALF_UP ) ); }
Kod testu:
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()); }
Wynik:
źródło
input.toBigInteger().toString().length()
część byłaby znacznie bardziej wydajna przy użyciu logarytmu, coś takiego jakround_up(log(input)) + (1 if input is a power of ten, else 0)
Wystarczy spojrzeć na:
http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP
i:
setScale(int precision, int roundingMode)
Lub jeśli używasz Java 6, to
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
i albo:
setScale(int precision, RoundingMode mode); round(MathContext mc);
źródło
Nie sądzę, aby można było to tak zaokrąglić jednym poleceniem. Próbować
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
Przetestowałem resztę twoich przykładów i zwraca żądane wartości, ale nie gwarantuję jego poprawności.
źródło
Chcesz
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
źródło
round
: „Jeśli ustawienie dokładności wynosi 0, zaokrąglanie nie następuje”.