Java BigDecimal Tutorial with Example
November 20, 2023
This page will walk through Java BigDecimal
tutorial with example. BigDecimal
is an immutable, arbitrary-precision signed decimal number. It performs the operations of java.lang.Math
class and it is used to fetch precision, round, unit in the last place (ULP), engineering notation values etc.
Instantiate
BigDecimal
and can access its value as follows.
BigDecimal b = new BigDecimal("215.87"); b.intValue();
BigDecimal
using MathContext
.
MathContext mc = new MathContext(2, RoundingMode.CEILING); BigDecimal b = new BigDecimal("215.87", mc);
BigDecimal
methods in detail.
Contents
- 1. add()
- 2. subtract()
- 3. multiply()
- 4. divide()
- 5. divideToIntegralValue()
- 6. remainder()
- 7. divideAndRemainder()
- 8. pow()
- 9. abs()
- 10. negate()
- 11. plus()
- 12. signum()
- 13. scale()
- 14. precision()
- 15. unscaledValue()
- 16. round()
- 17. scaleByPowerOfTen()
- 18. stripTrailingZeros()
- 19. compareTo()
- 20. equals()
- 21. min() and max()
- 22. toEngineeringString()
- 23. ulp()
- 24. Reference
1. add()
add()
method adds two BigDecimal
instances.
AddDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class AddDemo { public static void main(String[] args) { BigDecimal b = new BigDecimal("234.43"); BigDecimal bres = b.add(new BigDecimal("450.23")); System.out.println("Add: " + bres); //Using MathContext MathContext mc = new MathContext(2, RoundingMode.DOWN); BigDecimal bdecMath = b.add(new BigDecimal("450.23"), mc); System.out.println("Add using MathContext: " + bdecMath); } }
Add: 684.66 Add using MathContext: 6.8E+2
2. subtract()
subtract()
method subtracts the given BigDecimal
from calling BigDecimal
instance.
SubtractDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class SubtractDemo { public static void main(String[] args) { BigDecimal b = new BigDecimal("50.345"); BigDecimal bdec = b.subtract(new BigDecimal("34.765")); System.out.println("Subtract: " + bdec); //Using MathContext MathContext mc = new MathContext(2, RoundingMode.FLOOR); BigDecimal bdecMath = b.subtract(new BigDecimal("34.765"), mc); System.out.println("Subtract using MathContext: " + bdecMath); } }
Subtract: 15.580 Subtract using MathContext: 15
3. multiply()
multiply()
multiplies two BigDecimal
instances.
MultiplyDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class MultiplyDemo { public static void main(String[] args) { BigDecimal bdec = new BigDecimal("50.23"); BigDecimal bdecRes = bdec.multiply(new BigDecimal("30.44")); System.out.println("Multiply:" + bdecRes); //Using MathContext MathContext mc = new MathContext(2, RoundingMode.DOWN); BigDecimal bdecMath = bdec.multiply(new BigDecimal("30.44"), mc); System.out.println("Multiply using MathContext: " + bdecMath); } }
Multiply:1529.0012 Multiply using MathContext: 1.5E+3
4. divide()
divide()
method divides the calling BigDecimal
by given BigDecimal
instance. According to java doc "if the exact quotient cannot be represented (because it has a non-terminating decimal expansion) an ArithmeticException is thrown".
DivideDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class DivideDemo { public static void main(String[] args) { BigDecimal bdec = new BigDecimal("706"); BigDecimal bdecRes = bdec.divide(new BigDecimal("20")); System.out.println("Divide: " + bdecRes); //Using MathContext MathContext mc = new MathContext(2, RoundingMode.FLOOR); BigDecimal bdecMath = bdec.divide(new BigDecimal("20"), mc); System.out.println("Divide using MathContext: " + bdecMath); } }
Divide: 35.3 Divide using MathContext: 35
5. divideToIntegralValue()
It returns aBigDecimal
whose value will be integer part of a/b.
DivideToIntegralValueDemo.java
package com.concretepage; import java.math.BigDecimal; public class DivideToIntegralValueDemo { public static void main(String[] args) { BigDecimal bdec = new BigDecimal("706"); BigDecimal bdecRes = bdec.divideToIntegralValue(new BigDecimal("20")); System.out.println("DivideToIntegralValue: " + bdecRes); } }
DivideToIntegralValue: 35
6. remainder()
It returns theBigDecimal
as remainder of the operation a % b. We can also pass MathContext
as an argument to get rounded result.
RemainderDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class RemainderDemo { public static void main(String[] args) { BigDecimal bdec = new BigDecimal("700.588"); MathContext mc = new MathContext(2, RoundingMode.CEILING); BigDecimal bdecMath = bdec.remainder(new BigDecimal("21.46"), mc); System.out.println("a % b using MathContext : " + bdecMath); } }
a % b using MathContext : 13.868
7. divideAndRemainder()
It returns an array ofBigDecimal
of the result of divide()
and remainder()
method for the two BigDecimal
instances.
DivideAndRemainderDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class DivideAndRemainderDemo { public static void main(String[] args) { MathContext mc = new MathContext(2, RoundingMode.FLOOR); BigDecimal bdec = new BigDecimal("123.56"); BigDecimal[] bdecRes = bdec.divideAndRemainder(new BigDecimal("23.43"), mc); System.out.println("a/b: " + bdecRes[0]); System.out.println("a % b: " + bdecRes[1]); } }
a/b: 5 a % b: 6.41
8. pow()
It calculates the power of aBigDecimal
value and returns a BigDecimal
. The exponent will be an integer.
PowDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class PowDemo { public static void main(String[] args) { int exponent = 7; MathContext mc = new MathContext(2, RoundingMode.CEILING); BigDecimal bdec = new BigDecimal("12"); BigDecimal bdecres = bdec.pow(exponent, mc); System.out.println("Pow: " + bdecres); } }
Pow: 3.6E+7
9. abs()
It returns aBigDecimal
with absolute value of a given BigDecimal
. We can also pass MathContext
as an argument that will return result with rounding.
AbsDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class AbsDemo { public static void main(String[] args) { BigDecimal b1 = new BigDecimal("-234.54"); System.out.println(b1.abs()); BigDecimal b2 = new BigDecimal("100.124"); System.out.println(b2.abs()); //Using MathContext MathContext mc = new MathContext(2, RoundingMode.CEILING); BigDecimal b3 = new BigDecimal("654.75"); System.out.println(b3.abs(mc)); } }
234.54 100.124 6.6E+2
10. negate()
It returns aBigDecimal
with negative value of the original value.
NegateDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class NegateDemo { public static void main(String[] args) { MathContext mc = new MathContext(2, RoundingMode.CEILING); BigDecimal bdec1 = new BigDecimal("-134.43", mc); System.out.println("negate() of -134.43 :"+bdec1.negate()); BigDecimal bdec2 = new BigDecimal("155.33", mc); System.out.println("negate() of 155.33 :" + bdec2.negate()); } }
negate() of -134.43 :1.3E+2 negate() of 155.33 :-1.6E+2
11. plus()
It returns aBigDecimal
with +this
PlusDemo.java
package com.concretepage; import java.math.BigDecimal; public class PlusDemo { public static void main(String[] args) { BigDecimal bdec1 = new BigDecimal("-134.43"); System.out.println("plus() of -134.43 :"+bdec1.plus()); BigDecimal bdec2 = new BigDecimal("155.33"); System.out.println("plus() of 155.33 :" + bdec2.plus()); } }
plus() of -134.43 :-134.43 plus() of 155.33 :155.33
12. signum()
It returns the signum function values of theBigDecimal
. Signum function value for negative values is -1 and signum function for 0 is 0 and signum function for positive value is +1.
SignumDemo.java
package com.concretepage; import java.math.BigDecimal; public class SignumDemo { public static void main(String[] args) { //-1 for values < 0 System.out.println("signum for -15.56: "+ new BigDecimal("-15.56").signum()); //0 for value 0 System.out.println("signum for 0.0: "+ new BigDecimal("0.0").signum()); //1 for values > 0 System.out.println("signum for 25.43: "+ new BigDecimal("25.43").signum()); } }
signum for -15.56: -1 signum for 0.0: 0 signum for 25.43: 1
13. scale()
This method returns the scale ofBigDecimal
.
ScaleDemo.java
package com.concretepage; import java.math.BigDecimal; public class ScaleDemo { public static void main(String[] args) { //If zero or positive, the scale is the number of digits to the right of the decimal point. System.out.println("scale for 0.0 : "+ new BigDecimal("0.0").scale()); System.out.println("scale for 134.23: "+ new BigDecimal("134.23").scale()); //If negative, the unscaled value of the number is multiplied //by ten to the power of the negation of the scale. System.out.println("scale for -13.231: "+ new BigDecimal("-13.231").scale()); } }
scale for 0.0 : 1 scale for 134.23: 2 scale for -13.231: 3
14. precision()
This method returns the precision ofBigDecimal
.
PrecisionDemo.java
package com.concretepage; import java.math.BigDecimal; public class PrecisionDemo { public static void main(String[] args) { System.out.println("precision for 0.0 : "+ new BigDecimal("0.0").precision()); System.out.println("precision for 134.23: "+ new BigDecimal("134.23").precision()); System.out.println("precision for -13.231: "+ new BigDecimal("-13.231").precision()); } }
precision for 0.0 : 1 precision for 134.23: 5 precision for -13.231: 5
15. unscaledValue()
It calculates the unscaled value of a givenBigDecimal
. It computes this * 10^this.scale().
UnscaledValueDemo.java
package com.concretepage; import java.math.BigDecimal; public class UnscaledValueDemo { public static void main(String[] args) { System.out.println("unscaledValue for 0.0 : "+ new BigDecimal("0.0").unscaledValue()); System.out.println("unscaledValue for 134.23: "+ new BigDecimal("134.23").unscaledValue()); System.out.println("unscaledValue for -13.231: "+ new BigDecimal("-13.231").unscaledValue()); } }
unscaledValue for 0.0 : 0 unscaledValue for 134.23: 13423 unscaledValue for -13.231: -13231
16. round()
It rounds aBigDecimal
according to a given MathContext
.
RoundDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class RoundDemo { public static void main(String[] args) { MathContext mc = new MathContext(2, RoundingMode.CEILING); System.out.println("scale for 0.0 : "+ new BigDecimal("0.0").round(mc)); System.out.println("scale for 134.23: "+ new BigDecimal("134.23").round(mc)); System.out.println("scale for -13.231: "+ new BigDecimal("-13.231").round(mc)); } }
scale for 0.0 : 0.0 scale for 134.23: 1.4E+2 scale for -13.231: -13
17. scaleByPowerOfTen()
It returns theBigDecimal
with the value (this * 10n).
ScaleByPowerOfTenDemo.java
package com.concretepage; import java.math.BigDecimal; public class ScaleByPowerOfTenDemo { public static void main(String[] args) { BigDecimal b1 = new BigDecimal("12.5"); System.out.println("Result: "+b1.scaleByPowerOfTen(4)); } }
Result: 1.25E+5
18. stripTrailingZeros()
It strips tailing zeros and returns aBigDecimal
with equal value of original BigDecimal
.
StripTrailingZerosDemo.java
package com.concretepage; import java.math.BigDecimal; public class StripTrailingZerosDemo { public static void main(String[] args) { BigDecimal b = new BigDecimal("120000.00"); System.out.println("Result: "+b.stripTrailingZeros()); } }
Result: 1.2E+5
19. compareTo()
This method compares theBigDecimal
with given BigDecimal
and returns -1, 0 or 1 as this BigDecimal
is numerically less than, equal to, or greater than given value. If the values of BigDecimal
instances are equal but scales are different, they are considered equal for compareTo()
method.
CompareToDemo.java
package com.concretepage; import java.math.BigDecimal; public class CompareToDemo { public static void main(String[] args) { System.out.println(new BigDecimal("300.43").compareTo(new BigDecimal("150.12"))); System.out.println(new BigDecimal("200.42").compareTo(new BigDecimal("350.56"))); System.out.println(new BigDecimal("140.56").compareTo(new BigDecimal("140.21"))); } }
1 -1 1
20. equals()
This method checks for equality of aBigDecimal
with a given BigDecimal
. If the values of BigDecimal
instances are equal but scales are different, they are not considered as equal by equals()
method.
EqualsDemo.java
package com.concretepage; import java.math.BigDecimal; public class EqualsDemo { public static void main(String[] args) { System.out.println(new BigDecimal("300.34").equals(new BigDecimal("150.67"))); System.out.println(new BigDecimal("140.78").equals(new BigDecimal("140.78"))); } }
false true
21. min() and max()
min()
returns the BigDecimal
with minimum value and max()
returns the BigDecimal
with maximum value between the two BigDecimal
instances.
MinMaxDemo.java
package com.concretepage; import java.math.BigDecimal; public class MinMaxDemo { public static void main(String[] args) { System.out.println("Min: "+ new BigDecimal("300.34").min(new BigDecimal("150.87"))); System.out.println("Max: "+new BigDecimal("300.34").max(new BigDecimal("150.87"))); } }
Min: 150.87 Max: 300.34
22. toEngineeringString()
It returnsBigDecimal
with Engineering notation
ToEngineeringStringDemo.java
package com.concretepage; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class ToEngineeringStringDemo { public static void main(String[] args) { MathContext mc = new MathContext(2, RoundingMode.CEILING); BigDecimal bdec = new BigDecimal("234.87", mc); System.out.println("Result: "+ bdec); System.out.println("Result with toEngineeringString(): "+bdec.toEngineeringString()); } }
Result: 2.4E+2 Result with toEngineeringString(): 240
23. ulp()
It returnsBigDecimal
with ULP(Unit in the last place)
ULPDemo.java
package com.concretepage; import java.math.BigDecimal; public class ULPDemo { public static void main(String[] args) { BigDecimal bdec = new BigDecimal("234.87"); System.out.println("ULP of 234.87 : "+ bdec.ulp()); } }
ULP of 234.87 : 0.01