2017-07-27 2 views
0

In Android Studio hatte ich Probleme mit der Berechnung der Rechnungssummen wegen der Art und Weise Java Runden. Ich weiß, dass es viele Erklärungen gibt, aber viele empfehlen Methoden, die keine zuverlässigen Ergebnisse liefern. Zum Beispiel:
1. Math.round ((double) 4,715 * (double) 100)/(double) 100 = 4,72 (erwartet 4,72)
2. Math.round ((double) 4,725 * (double) 100)/(double) 100 = 4,72 (aber erwartet 4,73)Beobachtungen mit Round-in Android Studio - Java. Und einige praktische Erklärungen erwartet

Sie können diesen Code nicht in eine App für einen Kunden eingeben, der Rechnungen berechnet. Weil in meinem Fall zum Beispiel die gleiche Rechnung in einem anderen System berechnet wird und das Ergebnis anders ist, also 4.72 bzw. 4.73
Ich weiß, dass ein Doppel nicht genau dargestellt werden kann und die Dezimalzahlen sich von dem unterscheiden, was wir sehen. Aber wir brauchen eine Methode, die Ergebnisse liefert, wie wir es erwarten.

würde Ein anderes Beispiel sein:
1. java.math.BigDecimal.valueOf (4,715) .setScale (2, java.math.BigDecimal.ROUND_HALF_UP) .doubleValue() = 4,72
2. neuer java.math .BigDecimal (4.715) .setScale (2, java.math.BigDecimal.ROUND_HALF_UP) .doubleValue() = 4.71
3. neu java.math.BigDecimal (String.valueOf (4.715)) .setScale (2, java.math .BigDecimal.ROUND_HALF_UP) .doubleValue() = 4.72

Ich denke, alle diese Aspekte könnten in der Java-Dokumentation gut erklärt werden, aber sie sollten eine bestimmte Methode zur Berechnung von Runden angeben, eine zuverlässige Methode, die Ergebnisse wie erwartet liefert. Ich wollte nur auf 2 Dezimale runden.

Abschließend, die ich hoffe, einige der Anfänger helfen wird, denke ich, dass das folgende Verfahren zurückkehren würde stabile und gute Ergebnisse:
java.math.BigDecimal.valueOf (4,715) .setScale (2, java.math .BigDecimal.ROUND_HALF_UP) .doubleValue() = 4.72

Oder zumindest ist dies meine Beobachtung nach 3+ Jahren intensiver Nutzung einer App (500+ Benutzer an jedem Arbeitstag).
Alle praktischen Erklärungen für diese oben sind sehr willkommen, also können wir besser verstehen, wie man unerwartete Ergebnisse vermeidet.

+0

Ihre ersten 1 & 2 sind falsch. – matt

+0

Wenn Sie BigDecimals verwenden, initialisieren Sie sie mit Strings, nicht mit Double- oder Floats. Also 'x = new java.math.BigDecimal (" 4.715 "). SetScale (2, BigDecimal.ROUND_HALF_UP);' Benutze double überhaupt nicht, also mache auch keinen '.doubleValue()' auf dem BigDecimal. –

+0

Matt, 1 und 2 können falsch sein, aber es ist genau so, wie sie vom Debugger sind. und das war ein Problem, mit dem ich auf dem Gebiet konfrontiert wurde. ich wollte diese Aspekte nur für einen Anfänger offenlegen, da die Dokumentation nicht auf praktische Beispiele angewendet wird, sondern nur aus mathematischen Gesichtspunkten erklärt wird. – mihai71

Antwort

0

Für die BigDecimal Beispiele erklärt das Javadoc den Unterschied.

BigDecimal(double value) ... ist die genaue dezimale Darstellung des binären Gleitkommawerts des Doppelwerts.

Welche können wir überprüfen, indem Sie nur den Wert drucken.

System.out.println(new BigDecimal(4.715)); 
#4.714999999999999857891452847979962825775146484375 

Das ist kaum weniger als 4,715, aber genug, dass es abgerundet wird.

BigDecimal.valueOf(double value) verwendet die Zeichenfolgendarstellung des doppelten Wertes von Double.toString(double value), die ziemlich viele Regeln hat.

System.out.println(Double.toString(4.715)); 
#4.715 

Die sicherste Beste ist gerade BigDecimal für Ihre Berechnungen zu verwenden.

Verwandte Themen