2016-02-16 55 views
26

Sto usando BigDecimal per i miei numeri nella mia applicazione, ad esempio con JPA. Ho fatto un po 'di ricerca sui termini' precisione 'e' scala 'ma non capisco cosa sono esattamente.BigDecimal, precisione e scala

Qualcuno può spiegarmi il significato di "precisione" e "scala" per un valore BigDecimal?

@Column(precision = 11, scale = 2) 

Grazie!

+0

La domanda non ha assolutamente nulla con 'java.math.BigDecimal'. '@ javax.persistence.Column' non fa parte di Java SE. È l'argomento dell'APP. – Tiny

+1

Precisione e scala sono termini usati spesso per java.math.BigDecimal, che è quello che usa per i calcoli, per esempio con JPA. ISTM lui o lei vuole sapere cosa significano nel contesto di BigDecimal, va bene. –

risposta

39

Un BigDecimal è definita da due valori: un numero intero precisione arbitraria e un intero a 32 bit scala. Il valore di BigDecimal è definito come unscaledValue*10^{-scale}.

precisione:

Il precision è il numero di cifre del valore non scalato. Ad esempio, per il numero 123,45, la precisione è restituito 5.

Quindi, precisione indica la lunghezza del numero intero precisione arbitraria. Ecco alcuni esempi di numeri con la stessa scala, ma diversa precisione:

  • 12345/100000 = 0,12345 // scala = 5, precisione = 5
  • 12340/100000 = 0,1234 // scala = 5, precisione = 4
  • 1/100000 = 0,00001 // scala = 5, precisione = 1

Nel caso particolare che il numero è uguale a zero (cioè 0.000), la precisione è sempre 1.

Scala:

Se zero o positivo, il scale è il numero di cifre a destra del punto decimale. Se negativo, il valore non graduato del numero viene moltiplicato per dieci alla potenza della negazione della scala. Ad esempio, una scala da -3 significa che il valore non scalato viene moltiplicato per 1000.

Ciò significa che il valore intero della ‘BigDecimal’ viene moltiplicato per 10^{-scale}.

Ecco alcuni esempi della stessa precisione, con diverse scale:

  • 12345 con scala 5 = 0,12345
  • 12345 con scala 4 = 1.2345
  • ...
  • 12345 con scala 0 = 12345
  • 12345 con scala -1 = 123450

BigDecimal.toString:

Procedimento toString per un BigDecimal si comporta diversamente basato sulla scala e precision. (Grazie a @RudyVelthuis per la precisazione.)

  • Se scale == 0, il numero intero viene appena stampato, così com'è.
  • Se scale < 0, E-Notation viene sempre utilizzato (es scala -1 5 produce "5E + 1")
  • Se scale >= 0 e precision - scale -1 >= -6 viene prodotto un numero decimale unita (es 10000000 scala 1 produce "1000000,0")
  • In caso contrario, viene utilizzata la notazione elettronica, ad es 10 la scala 8 produce "1.0E-7" poiché precision - scale -1 uguale a unscaledValue*10^{-scale} è inferiore a -6.

Altri esempi:

  • 19/100 = 0,19 // = integer 19, scala = 2, precisione = 2
  • 1/1000 = 0,0001 // intero = 1, scala = 4, precisione = 1
+2

In realtà, '[12345, -1]' è meglio rappresentato da '1.2345E + 5', che probabilmente è anche quello che restituisce' ToString'. Altrimenti, spiegazione molto bella. –

+1

Ottima spiegazione con esempi! – jpadilladev

+0

@RudyVelthuis Grazie, ho aggiunto una sezione che spiega come il metodo toString determina se utilizzare o meno la notazione E + –

3

Citando Javadoc:

La precisione è il numero di cifre del valore non scalato.

e

Se zero o positivo, la scala è il numero di cifre a destra del punto decimale. Se negativo, il valore non graduato del numero viene moltiplicato per dieci alla potenza della negazione della scala. Ad esempio, una scala da -3 significa che il valore non scalato viene moltiplicato per 1000.

14

precisione: Numero di cifre significative

Scala: numero di cifre a destra del punto decimale

(Source)

0

Dalla esempio annotazione le cifre massimo è 2 dopo il punto decimale e 9 prima (totalmente 11): 123456789,01