Einführung in BigDecimal
Die Erklärung im JDK -Dokument (Chinesisch) lautet wie folgt:
Unveränderliche, unterzeichnete Dezimalzahl der willkürlichen Präzision. BigDecimal besteht aus einem ganzzahligen nicht-skalischen Wert jeder Präzision und einer 32-Bit-Ganzzahl-Skala. Wenn es Null oder positiv ist, ist die Skala die Anzahl der Ziffern nach dem Dezimalpunkt. Wenn es sich um eine negative Zahl handelt, multiplizieren Sie den nicht skalierenden Wert der Zahl mit einer negativen Skalierungsleistung von 10. Daher ist der von BigDecimal dargestellte Wert (unellkalierter Wert × 10).
Spezifische Erklärung
1. "Der Wert des Bigdecimal -Objekts ist unveränderlich". Dies zeigt diese Funktion in der Betriebsfunktion des BigDecimal -Objekts:
Die Codekopie lautet wie folgt: BigDecimal a = new BigDecimal ("1,22");
System.out.println ("Konstrukt mit einem Stringwert:" + a);
BigDecimal B = neuer BigDecimal ("2,22");
A.Add (b);
System.out.println ("a plus b ist:" + a);
Es ist leicht zu glauben, dass es ausgeben wird:
Konstruktieren Sie mit einem Stringwert: 1.22
A Plus B ist: 3.44
Aber in der Tat ist A plus b: 1.22
2. "BigDecimal besteht aus einem ganzzahligen Nicht-Maßwert einer Genauigkeit und einer 32-Bit-Ganzzahl-Skala. Wenn der Skalierungswert Null oder positiv ist, ist die Skala die Anzahl der Ziffern nach dem Dezimalpunkt." Dieser Satz kann so gelesen werden:
Zum Beispiel: -12 und 13.412
Ausgedrückt als: -12 × 10-0 und 13412 × 10-3
Hier (Nicht-Scaling-Werte und Skalen) werden als: [-12, 0] bzw. [13412, 3] dargestellt
3. "Wenn der Skalierungswert eine negative Zahl ist, multiplizieren Sie den nichtskaligen Wert der Zahl mit einer negativen Skalierungsleistung von 10". Dieser Satz kann so gelesen werden:
Zum Beispiel: 120.00
Dieser Wert wird ausgedrückt als: 12000 × 10-2
Hier (nichtskaliger Wert und Skala) werden ausgedrückt als: [12000, 2]
Der Wert der Skala hier ist immer noch positiv 2, führt jedoch die folgenden Operationen aus:
BigDecimal Menge = New BigDecimal ("-120,00");
// gibt BigDecimal Numerical entspricht dieser Dezimalzahl, entzieht jedoch alle Schwanznullen aus dieser Darstellung.
Betrag = Betrag.striptrailingzeros ();
Dieser Wert wird ausgedrückt als: 12 × 10-(-1)
Hier (nichtskaliger Wert und Skala) werden ausgedrückt als: [12, -1]
Anmerkungen zur Verwendung
1. Konstruktor
Die Codekopie lautet wie folgt: BigDecimal adouble = new BigDecimal (1,22);
System.out.println ("Konstrukt mit einem Doppelwert:" + adouble);
BigDecimal Astring = New BigDecimal ("1,22");
System.out.println ("Konstrukt mit einem Stringwert:" + adstring);
Das Ausgabeergebnis ist wie folgt:
Konstrukt mit einem Doppelvalue: 1.2199999999999999999973354647408996243029832839658203125
Konstruktieren Sie mit einem Zeichenfolgenwert: 1.22
Beschreibung von JDK:
a) Die Ergebnisse der Konstruktionsmethode mit dem Parametertyp -Doppel sind unvorhersehbar. Einige Leute denken vielleicht, dass das BigDecimal, das durch das Schreiben von Newbigdecimal (0,1) in Java geschrieben wurde, genau 0,1 (Nicht-Scaling-Wert 1, dessen Skala 1 beträgt) entspricht, aber tatsächlich gleich 0,1000000000000000000000555511512312578270211815834545415625 ist. Dies liegt daran, dass 0,1 nicht als doppeltes ausgedrückt werden können (oder für diesen Fall nicht als Binärdezimal für endliche Länge ausgedrückt werden kann). Auf diese Weise beträgt der in die Konstruktionsmethode übergebene Wert nicht genau 0,1 (obwohl er diesem Wert gleich ist).
b) Andererseits ist der String -Konstruktor vollständig vorhersehbar: Das Schreiben von NewbigDecimal ("0,1") erzeugt eine BigDecimal, die genau die erwarteten 0,1 ist. Im Vergleich dazu wird im Allgemeinen empfohlen, zuerst den String Constructor zu verwenden.
c) Wenn das Doppel als Quelle für BigDecimal verwendet werden muss, beachten Sie, dass dieser Konstruktor eine genaue Konvertierung bietet. Es liefert nicht dasselbe Ergebnis wie: Verwenden Sie zuerst die Double.ToString -Methode (doppelte) Methode und verwenden Sie dann den BigDecimal -Konstruktor (String). Um doppelt in String umzuwandeln, können Sie auch die statische Methode von String verwenden: String.Valueof (doppelt).
2. Betrieb. Addition, Subtraktion, Multiplikation und Division geben tatsächlich ein neues BigDecimal -Objekt zurück, da BigDecimal unveränderlich ist und ein neues Objekt bei jedem Betriebsschritt erzeugt wird, also A.Add (b); Obwohl der Additionsvorgang durchgeführt wird, speichert A den Wert nach dem Additionsvorgang nicht. Die korrekte Verwendung sollte a = a.add (b) sein;
Beispiel:
Stellen Sie fest, ob das BigDecimal -Objekt eine Ganzzahl ist:
Kopieren Sie den Code wie folgt: Private boolean IssingerValue (BigDecimal Bd) {
return bd.Signum () == 0 || bd.scale () <= 0 || Bd.Striptrailingzeros (). Scale () <= 0;
}
Warum tun das? Bitte testen Sie das folgende Beispiel:
Kopieren Sie den Code wie folgt: BigDecimal Menge = New BigDecimal ("-120,00"); // Bitte versuchen Sie "0", "0,00", "1,00", "10,00" bzw. "10.10"
System.out.println (pension.signum ()); // positiv und negativ
System.out.println (pension.scale ()); //Skala
System.out.println (Betrag.striptrailingzeros (). Scale ()); // sca. nach Nulling
Referenz: Klasse BigDecimal