Antworten:
Mit können Sie setScale()
die Anzahl der Bruchstellen auf Null reduzieren. Angenommen, der zu value
rundende Wert enthält:
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
Die Verwendung round()
ist etwas komplizierter, da Sie die Anzahl der beizubehaltenden Ziffern angeben müssen. In Ihren Beispielen wäre dies 3, dies gilt jedoch nicht für alle Werte:
BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);
(Beachten Sie, dass BigDecimal
Objekte sind unveränderlich, beide setScale
und round
ein neues Objekt zurück.)
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
druckt falsch
RoundingMode
was ist das? Es istBigDecimal
Wenn ich mich an Grodriguez 'Antwort halte
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
Dies ist die Ausgabe
100.23 -> 100
100.77 -> 101
Was nicht ganz das ist, was ich will, also habe ich das gemacht.
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
Das bekomme ich
100.23 -> 100.00
100.77 -> 101.00
Dies löst mein Problem vorerst .. :) Vielen Dank an alle.
DecimalFormat
(wie in new DecimalFormat("###.00")
) die Konvertierung eines BigDecimal
Backs in einen String verwalten. Es ergibt "101.00"
als Ergebnis für beide Werte, dass die Snippets von @Grodriquez und Sie erstellt haben.
Hier ist eine schrecklich komplizierte Lösung, aber sie funktioniert:
public static BigDecimal roundBigDecimal(final BigDecimal input){
return input.round(
new MathContext(
input.toBigInteger().toString().length(),
RoundingMode.HALF_UP
)
);
}
Testcode:
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());
}
Ausgabe:
100
100
101
101
input.toBigInteger().toString().length()
Teil wäre viel effizienter, wenn ein Logarithmus verwendet würde, so etwas wieround_up(log(input)) + (1 if input is a power of ten, else 0)
Schauen Sie sich einfach an:
http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP
und:
setScale(int precision, int roundingMode)
Oder wenn Sie Java 6 verwenden
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
und entweder:
setScale(int precision, RoundingMode mode);
round(MathContext mc);
Ich glaube nicht, dass Sie es mit einem einzigen Befehl so abrunden können. Versuchen
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
Ich habe den Rest Ihrer Beispiele getestet und es werden die gewünschten Werte zurückgegeben, aber ich kann die Richtigkeit nicht garantieren.
Sie wollen
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
round
: "Wenn die Genauigkeitseinstellung 0 ist, findet keine Rundung statt."