[JAVA] Verwenden Sie keine Floats und Doubles, um Geldbrüche zu berechnen

Nehmen wir zur Kenntnis, welche Teile während der Entwicklung von Accounting Sirth Japan durchlaufen wurden. Dies ist eine Geschichte, als ich zuvor die Entwicklung nach Übersee ausgelagert hatte, und es gab einen Teil, in dem ich leicht mit Floats und Doubles rechnen konnte, und ich habe sie selbst korrigiert.

Float und Double sind für die Teilberechnung des Betrags verboten

Grundsätzlich sollten binäre Gleitkommatypen wie Float und Double nicht in monetären Berechnungen verwendet werden. Warum? Es ist genau in Punktberechnung Weil es nicht berechnet werden kann.

Was bedeutet das

float a = 1.03;
float b = 0.42;

System.out.println(a-b)
0.6100000000000001

Es wird sein. Ich kann dir nicht den genauen Betrag geben ...

Verwenden Sie Big Decimal, um Betragsbrüche zu berechnen

Verwenden Sie Big Decimal, wenn Sie den Betrag genau berechnen möchten.

import java.math.BigDecimal

BigDecimal a = new BigDecimal("1.03");
BigDecimal b = new BigDecimal("0.42");

BigDecimal c = a.subtract(b);
System.out.println(c.toString());
0.61

BigDecimal kann nicht durch einen Berechnungscode beschrieben werden, daher ist es ohnehin schwer zu erkennen und scheint ärgerlich zu sein.

Große Dezimalfalle

Es gibt eine Falle, wenn es in Ordnung ist, Big Decimal hier zu verwenden. Wenn Sie bei der anfänglichen Zuweisung in BigDecimal einen Fehler machen, ist dieser bedeutungslos, obwohl Sie versuchen, in BigDecimal genau zu berechnen. Dies bedeutet, dass Sie einen Bruch beim Ersetzen nicht numerisch ersetzen dürfen. Sie müssen es durch einen Buchstaben ersetzen.

BigDecimal rate1 = new BigDecimal("0.1");
BigDecimal rate2 = new BigDecimal(0.1);

Das ist der Unterschied Ersteres kann genau berechnet werden, da es als Zeichenfolgenargument übergeben wird. Letzteres ist eine Falle, in der 0.1 zum Konstruktor des Doppelarguments fließt, also als binärer Gleitkomma behandelt und dann zugewiesen wird! Ich brauche den Konstruktor für doppelte Argumente selbst nicht und möchte, dass es sich um einen Kompilierungsfehler handelt.

Schließlich

Ich habe überall Floats und Doubles für das Outsourcing verwendet, und es war mühsam, das Problem zu beheben. Ich habe eine beängstigende Fraktionsverarbeitung durchgeführt, um den Fehler durch den Umgang mit kleinen Händen zu korrigieren. Ich war ängstlich. Es ist einfach, die Verhältnisberechnung und Koordinatenberechnung der Bildschirmkonfiguration zu programmieren, die keine perfekte Genauigkeit erfordert. Daher ist es einfach, double oder float zu verwenden, aber für diejenigen, die ein System bauen, das mit Geld umgeht, "double for money". Es ist allgemein bekannt, dass Sie von Anfang an wissen sollten, dass "Float verboten ist". Ich werde später um 1 Yen weinen.

Wir haben diese Offshore-Produktion eingestellt und komplett im eigenen Haus hergestellt. Derzeit suchen wir Freunde, um das System gemeinsam zu entwickeln.

Recommended Posts

Verwenden Sie keine Floats und Doubles, um Geldbrüche zu berechnen
Wie man Big Decimal benutzt
Verwendung von StringBurrer und Arrays.toString.
Verwendung von EventBus3 und ThreadMode
[Java] Verwenden Sie nicht "+" im Anhang!
Wie man Gleichheit und Gleichheit benutzt (wie man Gleichheit benutzt)
Verwendung von OrientJS und OrientDB zusammen
So richten Sie kapt ein und verwenden es
[Rails] [Hinweis] Wann = zu <%%> hinzugefügt werden soll und wann nicht
Verwendung von Teilzeichenfolgen und Substratmethoden
Verwendung von @Builder und @NoArgsConstructor zusammen
Geben Sie keine Parameter für die POST-Anforderung und die URL aus dem Formular mit Wicket aus