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! 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 .
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 .
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
andprecision - 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ę 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
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.
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.
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
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