2016-02-16 10 views
26

Ich verwende BigDecimal für meine Nummern in meiner Anwendung, zum Beispiel mit JPA. Ich habe ein bisschen nach den Begriffen "Präzision" und "Skalierung" recherchiert, aber ich verstehe nicht, was genau sie sind.BigDecimal, Präzision und Maßstab

Kann mir jemand die Bedeutung von 'Präzision' und 'Maßstab' für einen BigDecimal-Wert erklären?

@Column(precision = 11, scale = 2) 

Vielen Dank!

+0

Die Frage hat absolut nichts mit 'java.math.BigDecimal'. '@ javax.persistence.Column' ist nicht Teil von Java SE. Es ist das Thema von JPA. – Tiny

+1

Präzision und Skalierung sind Begriffe, die oft für java.math.BigDecimal verwendet werden, was er für Berechnungen verwendet, zum Beispiel mit JPA. ISTM möchte er oder sie wissen, was sie im Zusammenhang mit BigDecimal meinen. –

Antwort

39

BigDecimal A wird durch zwei Werte definiert. Der Wert von BigDecimal ist definiert als unscaledValue*10^{-scale}.

Präzision:

Die precision ist die Anzahl der Ziffern in dem unskalierten Wert. beispielsweise für die Nummer 123.45 kehrte die Präzision 5.

So Präzision die Länge der ganzen Zahl beliebiger Genauigkeit angibt. Hier sind ein paar Beispiele von Zahlen mit dem gleichen Maßstab, aber unterschiedliche Präzision:

  • 12345/100000 = 0,12345 // scale = 5, Präzision = 5
  • 12340/100000 = 0,1234 // scale = 5, Präzision = 4
  • 1/100000 = 0,00001 // scale = 5, Präzision = 1

im speziellen Fall, dass die Anzahl auf Null gesetzt (dh 0,000) gleich ist, die Genauigkeit ist immer 1.

Maßstab:

Wenn null oder positiv, die scale ist die Anzahl der Ziffern rechts von dem Dezimalkomma. Wenn negativ, wird der unskalierte Wert der Zahl mit der Potenz der Negation der Skala multipliziert. Zum Beispiel bedeutet eine Skala von -3 der nicht skalierten Wert von 1000.

multipliziert wird, Dies bedeutet, dass der ganzzahlige Wert des ‚BigDecimal‘ von 10^{-scale} multipliziert wird.

Hier sind einige Beispiele für die gleiche Präzision, mit unterschiedlichen Maßstäben:

  • 12345 mit Skala 5 = 0,12345
  • 12345 mit Skala 4 = 1,2345
  • ...
  • 12345 mit Skala 0 = 12345
  • 12345 mit Skala 1 = 123450

BigDecimal.toString:

Die toString Verfahren für ein BigDecimal verhält sich auf die Waage und precision unterschiedlich basiert. (Dank @RudyVelthuis für den Hinweis.)

  • Wenn scale == 0, die ganze Zahl wird nur ausgedruckt, wie sie ist.
  • Wenn scale < 0, E-Notation immer verwendet wird (zB 5 Maßstab produziert -1 "5E + 1")
  • Wenn scale >= 0 und precision - scale -1 >= -6 eine einfache Dezimalzahl erzeugt wird (zB 10000000 Maßstab 1 erzeugt "1000000,0")
  • Andernfalls wird E-Notation verwendet, z 10 Maßstab 8 erzeugt "1.0E-7", da precision - scale -1 gleich unscaledValue*10^{-scale} kleiner als -6 ist.

Weitere Beispiele:

  • 19/100 = 0,19 // integer = 19, scale = 2, Präzision = 2
  • 1/1000 = 0,0001 // integer = 1, Zunder = 4, Genauigkeit = 1
+2

Eigentlich ist '[12345, -1]' besser durch '1.2345E + 5' repräsentiert, was wahrscheinlich auch ToString ist. Ansonsten sehr schöne Erklärung. –

+1

Große Erklärung mit Beispielen! – jpadilladev

+0

@RudyVelthuis Danke, ich habe einen Abschnitt hinzugefügt, der erklärt, wie die toString-Methode bestimmt, ob E + Notation zu verwenden ist oder nicht –

3

Javadoc Zitiert:

Die Präzision ist die Anzahl der Ziffern in dem unskalierten Wert.

und

Wenn null oder positiv ist, ist die Waage die Anzahl der Ziffern rechts von dem Dezimalkomma. Wenn negativ, wird der unskalierte Wert der Zahl mit der Potenz der Negation der Skala multipliziert. Zum Beispiel bedeutet eine Skala von -3 der unskalierten Wert multipliziert wird von 1000.

14

Präzision: Anzahl der signifikanten Stellen

Maßstab: Anzahl der Ziffern rechts vom Komma

(Source)

0

Von Ihrem Beispiel Annotation der maximalen Ziffern 2 nach dem Komma und 9 vor (total 11):mit beliebiger Genauigkeit ganze Zahl ist und ein 32-Bit-Integer Skala:123456789,01