BigDecimal, precyzja i skala

Używam BigDecimal dla moich liczb w mojej aplikacji, na przykład z JPA. Zrobiłem trochę badań na temat terminów "precyzja" i "skala", ale nie rozumiem, co to są dokładnie.

Czy ktoś może mi wyjaśnić znaczenie "precyzji" i "skali" dla dużej wartości?
@Column(precision = 11, scale = 2)
Dzięki!
Author: jpadilladev, 2016-02-16

4 answers

A BigDecimal jest zdefiniowana przez dwie wartości: Dowolna dokładna liczba całkowita i 32-bitowa liczba całkowita skala . Wartość BigDecimal jest zdefiniowana jako unscaledValue*10^{- Skala}.

Precyzja:

Dokładność jest liczbą cyfr w bezskalowanej wartości. Na przykład dla liczby 123.45 zwracana jest dokładność 5.

Tak więc, precyzja wskazuje długość dowolnej liczby całkowitej precyzji. Oto kilka przykładów liczb z tą samą skalą, ale różną precyzją:

  • 12345 / 100000 = 0.12345 // skala = 5, precyzja = 5
  • 12340 / 100000 = 0.1234 // skala = 5, precyzja = 4
  • 1 / 100000 = 0.00001 // skala = 5, precyzja = 1

W szczególnym przypadku, gdy liczba jest równa zeru (tj. 0.000), dokładność jest zawsze równa 1.

Skala:

Jeśli zero lub dodatnia, skala jest liczbą cyfr po prawej stronie miejsce po przecinku. Jeśli wartość jest ujemna, to wartość liczby jest mnożona przez dziesięć do potęgi negacji skali. Na przykład skala -3 oznacza, że wartość bez skalowania jest pomnożona przez 1000.

Oznacza to, że wartość całkowita "BigDecimal" jest mnożona przez 10^{-Skala}.

Oto kilka przykładów tej samej precyzji, o różnych skalach:]}
  • 12345 ze skalą 5 = 0.12345
  • 12345 ze skalą 4 = 1.2345
  • 12345 ze skalą 0 = 12345
  • 12345 ze skalą -1 = 123450

BigDecimal.toString:

Metoda toString dla BigDecimal zachowuje się inaczej w zależności od skali i precision. (Podziękowania dla @ RudyVelthuis za wskazanie tego.)

  • Jeśli scale == 0, liczba całkowita jest po prostu drukowana, tak jak jest.
  • If scale < 0, E-notacja jest zawsze używana (np. 5 skala -1 daje "5E+1")
  • If scale >= 0 and precision - scale -1 >= -6 a liczba dziesiętna jest wytwarzana (np. 10000000 w skali 1 daje "1000000.0")
  • W Przeciwnym Razie stosuje się notację E, np. skala 10 8 daje "1.0 E-7", ponieważ precision - scale -1 równa się unscaledValue*10^{- Skala} jest mniejsza niż -6.

Więcej przykładów:

  • 19/100 = 0.19 // integer=19, scale=2, precision=2
  • 1/1000 = 0.0001 // integer=1, scale = 4, precision = 1
 100
Author: Austin D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 17:36:31
  • Precyzja: całkowita liczba cyfr znaczących

  • Skala: liczba cyfr po prawej stronie punktu dziesiętnego

Zobacz BigDecimal dokumentacja klasy dla szczegółów.

 59
Author: hamena314,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-01 18:43:39

Cytowanie Javadoc :

Precyzja jest liczbą cyfr w bezskalowanej wartości.

I

Jeśli jest zero lub dodatnia, skala jest liczbą cyfr na prawo od punktu dziesiętnego. Jeśli wartość jest ujemna, to wartość liczby jest mnożona przez dziesięć do potęgi negacji skali. Na przykład skala -3 oznacza, że wartość bez skalowania jest pomnożona przez 1000.

 4
Author: Andy Turner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-16 14:55:17

Z przykładowej adnotacji Maksymalna liczba cyfr to 2 po przecinku i 9 przed (całkowicie 11): 123456789,01

 1
Author: adranale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-16 15:23:06