Rundungsproblem

internet

Top Contributor
Hallo,

ich versuche gerade eine Rechnung nachzustellen, aber scheitere an der Rundung:

Rechnungspositionen werden auf zwei Nachkommastellen symmetrisch gerundet. Die Regeln der symmetrischen Rundung (Banker's Rounding / Round to Even) sind hier erklärt.

Der erwartete Wert ist: 8,93 EUR
Ich bekomme aber 8,92 EUR

Java:
    BigDecimal priceTotalNet = new  BigDecimal(7.5);
    BigDecimal tax = new  BigDecimal(1.19).setScale(2, RoundingMode.HALF_EVEN);
      
    BigDecimal result = priceTotalNet.multiply(tax).setScale(2, RoundingMode.HALF_EVEN);
    System.out.print(result);

Wo ist mein Denkfehler?
 
Zuletzt bearbeitet:

internet

Top Contributor
Ich verstehe es leider auch nicht... Ich kann es aber bei zwei Rechnungsprogrammen nachstellen:

Programm1:

1640865468803.png
-> hier kommt auch das Zitat von meinem Eingangstext


Programm2:

1640865493454.png
 

Robert Zenz

Top Contributor
Bist du dir sicher dass das Zweite dann Half-Even verwendet? Mir ist bis jetzt (14 Jahre ERP Systeme) noch nie irgendwo Half-Even untergekommen, nur Half-Up...aber gut, das ist meine Erfahrung.

Und beim ersten wuerde ich mal sagen dass der Text veraltet ist (oder niemand dem Programmierer gesagt hat dass die Buchhaltung eine andere Rundung will).
 

LimDul

Top Contributor
Ich glaube das wird sich nicht klären lassen, ohne den Anbieter der Rechnungsprogramme zu kontaktieren. Meines Erachtens wird in beiden Fällen HALF_UP verwendet. Das ist für mich auch das geläufigere was mir bisher untergekommen ist.
 

Oneixee5

Top Contributor
HALF_EVEN rundet zum geraden Nachbarn also zur 2, steht auch so in der API. HALF_UP rundet zum nächst größeren Nachbarn also zur 3.
 
Zuletzt bearbeitet:

Oneixee5

Top Contributor
So kann man die Rechnung aber nicht nachrechnen, das Ergebnis in Java ist: 8.9249999999999996003197111349436454474925994873046875
Java:
        BigDecimal result = priceTotalNet.multiply(tax).setScale(2, RoundingMode.HALF_EVEN);
        if (result.compareTo(new  BigDecimal(8.925)) < 0) {
            System.out.println("result is lower then 8.925");
        }
 
Zuletzt bearbeitet:

Oneixee5

Top Contributor
Du könntest folgendes versuchen:
Java:
        BigDecimal priceTotalNet = new  BigDecimal(7.5, MathContext.DECIMAL64);
        BigDecimal tax = new  BigDecimal(1.19, MathContext.DECIMAL64);
        BigDecimal result = priceTotalNet.multiply(tax);
        System.out.println(result.setScale(2, RoundingMode.HALF_EVEN));
oder du rechnest in Cent.
 

Omikron1

Mitglied
ich versuche gerade eine Rechnung nachzustellen, aber scheitere an der Rundung:


Der erwartete Wert ist: 8,93 EUR
Ich bekomme aber 8,92 EUR

Damit dieses Thema mal ein Ende findet:

Java:
    public static final MathContext mc = new MathContext(3, RoundingMode.HALF_UP);

    public static BigDecimal add(BigDecimal l, BigDecimal r) {
        return l.add(r, mc);
    }

    public static BigDecimal subtract(BigDecimal l, BigDecimal r) {
        return l.subtract(r, mc);
    }

    public static BigDecimal multiply(BigDecimal l, BigDecimal r) {
        return l.multiply(r, mc);
    }

    public static BigDecimal divide(BigDecimal l, BigDecimal r) {
        return l.divide(r, mc);
    }

    public static void main(String[] args) {
        System.out.println(multiply(new BigDecimal("7.5"), new BigDecimal("1.19")).toPlainString());
    }
 

internet

Top Contributor
Der Hilfebeitrag war tatsächlich falsch bei diesem Anbieter und wurde angepasst: :eek:
Rechnungspositionen werden auf zwei Nachkommastellen kaufmännisch gerundet. Die Regeln der kaufmännischen Rundung (bürgerliche Rundung) sind hier erklärt.

Das heißt, das ist dann HALF_UP, korrekt?
 

Ähnliche Java Themen

Neue Themen


Oben