Frage

CentOs 5.4, OpenJDK Runtime Environment (Build 1.6.0-b09)

MathContext context = new MathContext(2, RoundingMode.FLOOR);  
BigDecimal total = new BigDecimal("200.0", context);

BigDecimal goodPrice = total.divide(BigDecimal.valueOf(3), 2, RoundingMode.FLOOR);
System.out.println("divided price=" + goodPrice.toPlainString());
// prints 66.66

BigDecimal goodPrice2 = total.divide(BigDecimal.valueOf(3), new MathContext(2,    RoundingMode.FLOOR));
System.out.println("divided price2=" + goodPrice2.toPlainString());
// prints 66

BUG?

War es hilfreich?

Lösung

Javadoc für die erste Situation:

  

Gibt eine BigDecimal, deren Wert (dieser / Teiler),   und deren Skala ist wie angegeben. Wenn Rundung muss durchgeführt werden, um ein Ergebnis mit dem angegebenen Maßstab zu erzeugen, der angegebene Rundungsmodus angewandt wird.

und die Javadoc für die zweite Situation:

  

Gibt eine BigDecimal, deren Wert (dieser / Teiler),   mit Rundung nach den Kontexteinstellungen.

Bezug auf die javadoc für MathContext erhalten wir:

  

Unveränderliche Objekte, die encapsulate   die Kontexteinstellungen, die beschreiben,   bestimmte Regeln für numerische Operatoren,   wie durch die implementierte diejenigen   BigDecimal Klasse.   Die Basis unabhängig   Einstellungen sind: Präzision: Die Zahl der   Stellen für eine Operation verwendet werden;   Ergebnisse werden auf diese Genauigkeit gerundet   roundingMode: a RoundingMode Objekt   der angibt, um den Algorithmus zu sein,   verwendet für die Rundung.

So im ersten Fall, Sie eine Skala von 2 angegeben, was bedeutet, dass Sie rund 2 Dezimalstellen der Genauigkeit, wo die Rundung als Bodenfunktion durchgeführt wird. Die zweite Berechnung hat eine spezifizierte Genauigkeit von 2, die an zwei Stellen an Genauigkeit gerundet ist, wobei die Rundung eine Bodenfunktion ist. Also, im ersten Fall, fragte Sie 2 Ziffern für nach der Dezimalstelle , und in der zweiten, die Sie gerade für 2 Stellen gefragt. Wenn zum Beispiel haben Sie für 4 Stellen in Ihrem MathContext gefragt, würden Sie 66,66 erhalten, wie Sie beantworten.

Also ich glaube nicht, dass dies ein Fehler ist, so viel wie, dass die beiden Methoden führen nicht die gleiche Berechnung.

Andere Tipps

Das ist völlig das erwartete Verhalten. Ich glaube, Sie den Fehler machen und mischen Rundung (Skala) und Präzision.

total.divide(BigDecimal.valueOf(3), 2, RoundingMode.FLOOR)

Hier können Sie Ihr die MathContext außer Kraft setzen und eine Rundung verwenden.

total.divide(BigDecimal.valueOf(3), new MathContext(2,    RoundingMode.FLOOR))

Hier stellen Sie eine Genauigkeit von 2 und erhalten nur zwei Ziffern.

Das Lesen die Javadoc für die Kluft (BigDecimal, MathContext) -Methode, so scheint es, dass nur der Rundungsmodus des Kontextes berücksichtigt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top