BigDecimal, precision and scale
Solution 1
A BigDecimal
is defined by two values: an arbitrary precision integer and a 32-bit integer scale. The value of the BigDecimal
is defined to be .
Precision:
The precision is the number of digits in the unscaled value. For instance, for the number 123.45, the precision returned is 5.
So, precision indicates the length of the arbitrary precision integer. Here are a few examples of numbers with the same scale, but different precision:
- 12345 / 100000 = 0.12345 // scale = 5, precision = 5
- 12340 / 100000 = 0.1234 // scale = 5, precision = 4
- 1 / 100000 = 0.00001 // scale = 5, precision = 1
In the special case that the number is equal to zero (i.e. 0.000), the precision is always 1.
Scale:
If zero or positive, the scale is the number of digits to the right of the decimal point. If negative, the unscaled value of the number is multiplied by ten to the power of the negation of the scale. For example, a scale of -3 means the unscaled value is multiplied by 1000.
This means that the integer value of the ‘BigDecimal’ is multiplied by .
Here are a few examples of the same precision, with different scales:
- 12345 with scale 5 = 0.12345
- 12345 with scale 4 = 1.2345
- …
- 12345 with scale 0 = 12345
- 12345 with scale -1 = 123450 †
BigDecimal.toString:
The toString
method for a BigDecimal
behaves differently based on the scale and precision
. (Thanks to @RudyVelthuis for pointing this out.)
- If
scale == 0
, the integer is just printed out, as-is. - If
scale < 0
, E-Notation is always used (e.g. 5 scale -1 produces "5E+1") - If
scale >= 0
andprecision - scale -1 >= -6
a plain decimal number is produced (e.g. 10000000 scale 1 produces "1000000.0") - Otherwise, E-notation is used, e.g. 10 scale 8 produces "1.0E-7" since
precision - scale -1
equals is less than -6.
More examples:
- 19/100 = 0.19 // integer=19, scale=2, precision=2
- 1/1000 = 0.0001 // integer=1, scale = 4, precision = 1
Solution 2
Precision: Total number of significant digits
Scale: Number of digits to the right of the decimal point
See BigDecimal
class documentation for details.
Solution 3
Quoting Javadoc:
The precision is the number of digits in the unscaled value.
and
If zero or positive, the scale is the number of digits to the right of the decimal point. If negative, the unscaled value of the number is multiplied by ten to the power of the negation of the scale. For example, a scale of -3 means the unscaled value is multiplied by 1000.
Solution 4
Precision is the total number of significant digits in a number. Scale is the number of digits to the right of the decimal point.
Examples:
123.456 Precision=6 Scale=3
10 Precision=2 Scale=0
-96.9923 Precision=6 Scale=4
0.0 Precision=1 Scale=1
Negative Scale
For a negative scale value, we apply the following formula: result = (given number) * 10 ^ (-(scale value)) Example
Given number = 1234.56
scale = -5
-> (1234.56) * 10^(-(-5))
-> (1234.56) * 10^(+5)
-> 123456000
Reference: https://www.logicbig.com/quick-info/programming/precision-and-scale.html
Solution 5
From your example annotation the maximum digits is 2 after the decimal point and 9 before (totally 11):
123456789,01
jpadilladev
Software and web Developer from Spain working at London.
Updated on February 01, 2022Comments
-
jpadilladev over 2 years
I'm using BigDecimal for my numbers in my application, for example, with JPA. I did a bit of researching about the terms 'precision' and 'scale' but I don't understand what are they exactly.
Can anyone explain me the meaning of 'precision' and 'scale' for a BigDecimal value?
@Column(precision = 11, scale = 2)
Thanks!
-
Rudy Velthuis about 8 yearsActually,
[12345, -1]
is better represented by1.2345E+5
, which is probably whatToString
will return, too. Otherwise, very nice explanation. -
jpadilladev about 8 yearsGreat explanation with examples!
-
Austin about 8 years@RudyVelthuis Thanks, I added a section explaining how the toString method determines whethe or not to use E+ notation
-
Rudy Velthuis about 8 yearsHeck, I see I wrote
ToString
. That is Delphi speak, not Java. ;-) -
BdEngineer about 5 yearscan you please help me with this stackoverflow.com/questions/54780779/…
-
jarosik about 5 years0.12345 - this is six digits total, not five
-
Austin about 5 years@jarosik 0.12345 has scale of 5 because there are 5 digits to the right of the decimal point. That there are six digits displayed doesn't necessarily matter.
-
Farid over 3 yearsYour example and reference contradict each other: Reference reads as
If zero or positive, the scale is the number of digits to the right of the decimal point
but in your example, you wrote0.12345 // scale = 5
and0.1234 // scale = 5
-
gagarwa almost 3 years@Farid,
0.1234
is mathematically equivalent to0.12340
. -
Koushik Roy over 2 yearswhy the scale is not 4 below? 12340 / 100000 = 0.1234 // scale = 5, precision = 4