Class DefaultBigDecimalMath
BigDecimalMath
that passes a current MathContext
to the
functions that need a MathContext
argument.
The initial default MathContext
is equivalent to MathContext.DECIMAL128
but this can be overridden by setting the following system properties:
ch.obermuhlner.math.big.default.precision
to a positive integer precision (default=34)ch.obermuhlner.math.big.default.rounding
to aRoundingMode
name (default=HALF_UP)
It is also possible to programmatically set the default MathContext
using setDefaultMathContext(MathContext)
.
It is recommended to set the desired precision in the MathContext
very early in the startup of the application and to not change it afterwards.
Important: Avoid the pitfall of setting the precision temporarily using setDefaultMathContext(MathContext)
for a calculation.
This can lead to race conditions and calculations with the wrong precision
if other threads in your application do the same thing.
To set a temporary MathContext
you have to choice to use either:
DefaultBigDecimalMath.createLocalMathContext()
in a try-with-resources statementDefaultBigDecimalMath.withLocalMathContext()
with a lambda function
DefaultBigDecimalMath.createLocalMathContext()
:
System.out.println("Pi[default]: " + DefaultBigDecimalMath.pi()); try (DefaultBigDecimalMath.LocalMathContext context = DefaultBigDecimalMath.createLocalMathContext(5)) { System.out.println("Pi[5]: " + DefaultBigDecimalMath.pi()); try (DefaultBigDecimalMath.LocalMathContext context2 = DefaultBigDecimalMath.createLocalMathContext(10)) { System.out.println("Pi[10]: " + DefaultBigDecimalMath.pi()); } System.out.println("Pi[5]: " + DefaultBigDecimalMath.pi()); } System.out.println("Pi[default]: " + DefaultBigDecimalMath.pi());Example code using
DefaultBigDecimalMath.withLocalMathContext()
:
System.out.println("Pi[default]: " + DefaultBigDecimalMath.pi()); DefaultBigDecimalMath.withPrecision(5, () -> { System.out.println("Pi[5]: " + DefaultBigDecimalMath.pi()); DefaultBigDecimalMath.withPrecision(10, () -> { System.out.println("Pi[10]: " + DefaultBigDecimalMath.pi()); }); System.out.println("Pi[5]: " + DefaultBigDecimalMath.pi()); }); System.out.println("Pi[default]: " + DefaultBigDecimalMath.pi());Both snippets with give the following ouput:
Pi[default]: 3.141592653589793238462643383279503 Pi[5]: 3.1416 Pi[10]: 3.141592654 Pi[5]: 3.1416 Pi[default]: 3.141592653589793238462643383279503
The temporary MathContext
are stored in ThreadLocal
variables
and will therefore not conflict with each other when used in multi-threaded use case.
Important: Due to the ThreadLocal
variables the local MathContext
will
not be available in other threads.
This includes streams using parallel()
, thread pools and manually started threads.
If you need temporary MathContext
for calculations then you must
set the local MathContext
inside every separate thread.
try (DefaultBigDecimalMath.LocalMathContext context = DefaultBigDecimalMath.createLocalMathContext(5)) { BigDecimalStream.range(0.0, 1.0, 0.01, DefaultBigDecimalMath.currentMathContext()) .map(b -> DefaultBigDecimalMath.cos(b)) .map(b -> "sequential " + Thread.currentThread().getName() + " [5]: " + b) .forEach(System.out::println); BigDecimalStream.range(0.0, 1.0, 0.01, DefaultBigDecimalMath.currentMathContext()) .parallel() .map(b -> { try (DefaultBigDecimalMath.LocalMathContext context2 = DefaultBigDecimalMath.createLocalMathContext(5)) { return DefaultBigDecimalMath.cos(b); } }) .map(b -> "parallel " + Thread.currentThread().getName() + " [5]: " + b) .forEach(System.out::println); }
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic class
The local context used to push and pop aMathContext
on the stack. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static MathContext
private static ThreadLocal
<Deque<MathContext>> -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic BigDecimal
acos
(BigDecimal x) Calculates the arc cosine (inverted cosine) ofBigDecimal
x using the currentMathContext
.static BigDecimal
acosh
(BigDecimal x) Calculates the arc hyperbolic cosine (inverse hyperbolic cosine) ofBigDecimal
x using the currentMathContext
.static BigDecimal
acot
(BigDecimal x) Calculates the inverse cotangens (arc cotangens) ofBigDecimal
x using the currentMathContext
.static BigDecimal
acoth
(BigDecimal x) Calculates the arc hyperbolic cotangens (inverse hyperbolic cotangens) ofBigDecimal
x using the currentMathContext
.static BigDecimal
add
(BigDecimal x, BigDecimal y) static BigDecimal
asin
(BigDecimal x) Calculates the arc sine (inverted sine) ofBigDecimal
x using the currentMathContext
.static BigDecimal
asinh
(BigDecimal x) Calculates the arc hyperbolic sine (inverse hyperbolic sine) ofBigDecimal
x using the currentMathContext
.static BigDecimal
atan
(BigDecimal x) Calculates the arc tangens (inverted tangens) ofBigDecimal
x using the currentMathContext
.static BigDecimal
atan2
(BigDecimal y, BigDecimal x) Calculates the arc tangens (inverted tangens) ofBigDecimal
y / x in the range -pi to pi using the currentMathContext
.static BigDecimal
atanh
(BigDecimal x) Calculates the arc hyperbolic tangens (inverse hyperbolic tangens) ofBigDecimal
x using the currentMathContext
.static BigDecimal
bernoulli
(int n) Calculates the Bernoulli number for the specified index using the currentMathContext
.static BigDecimal
cos
(BigDecimal x) Calculates the cosine (cosinus) ofBigDecimal
x using the currentMathContext
.static BigDecimal
cosh
(BigDecimal x) Calculates the hyperbolic cosine ofBigDecimal
x using the currentMathContext
.static BigDecimal
cot
(BigDecimal x) Calculates the cotangens ofBigDecimal
x using the currentMathContext
.static BigDecimal
coth
(BigDecimal x) Calculates the hyperbolic cotangens ofBigDecimal
x using the currentMathContext
.private static MathContext
createLocalMathContext
(int precision) Executes the givenRunnable
using the specified precision.createLocalMathContext
(int precision, RoundingMode roundingMode) Executes the givenRunnable
using the specified precision andRoundingMode
.createLocalMathContext
(MathContext mathContext) Executes the givenRunnable
using the specifiedMathContext
.static MathContext
Returns the currentMathContext
used for all mathematical functions in this class.static BigDecimal
divide
(BigDecimal x, BigDecimal y) static BigDecimal
e()
Returns the number e using the currentMathContext
.static BigDecimal
exp
(BigDecimal x) Calculates the natural exponent ofBigDecimal
x (ex) using the currentMathContext
.static BigDecimal
Calculates the factorial of the specifiedBigDecimal
using the currentMathContext
.static BigDecimal
gamma
(BigDecimal x) Calculates the gamma function of the specifiedBigDecimal
using the currentMathContext
.static MathContext
Returns the defaultMathContext
used for all mathematical functions in this class.private static int
getIntSystemProperty
(String propertyKey, int defaultValue) private static RoundingMode
getRoundingModeSystemProperty
(String propertyKey, RoundingMode defaultValue) static BigDecimal
log
(BigDecimal x) Calculates the natural logarithm ofBigDecimal
x using the currentMathContext
.static BigDecimal
log10
(BigDecimal x) Calculates the logarithm ofBigDecimal
x to the base 10 using the currentMathContext
.static BigDecimal
log2
(BigDecimal x) Calculates the logarithm ofBigDecimal
x to the base 2 using the currentMathContext
.static BigDecimal
multiply
(BigDecimal x, BigDecimal y) static BigDecimal
pi()
Returns the number pi using the currentMathContext
.private static MathContext
static BigDecimal
pow
(BigDecimal x, long y) static BigDecimal
pow
(BigDecimal x, BigDecimal y) private static <T> T
propertyException
(String propertyKey, String propertyValue, T defaultValue) private static void
pushMathContext
(MathContext mathContext) static BigDecimal
Calculates the reciprocal of the specifiedBigDecimal
using the currentMathContext
.static BigDecimal
remainder
(BigDecimal x, BigDecimal y) static BigDecimal
root
(BigDecimal x, BigDecimal n) Calculates the n'th root ofBigDecimal
x using the currentMathContext
.static BigDecimal
round
(BigDecimal value) Rounds the specifiedBigDecimal
to the precision of the currentMathContext
.static BigDecimal
Rounds the specifiedBigDecimal
to the precision of the currentMathContext
including trailing zeroes.static void
setDefaultMathContext
(MathContext defaultMathContext) Sets the defaultMathContext
used if no otherMathContext
is defined usingwithLocalMathContext(MathContext, Runnable)
.static BigDecimal
sin
(BigDecimal x) Calculates the sine (sinus) ofBigDecimal
x using the currentMathContext
.static BigDecimal
sinh
(BigDecimal x) Calculates the hyperbolic sine ofBigDecimal
x using the currentMathContext
.static BigDecimal
sqrt
(BigDecimal x) Calculates the square root ofBigDecimal
x using the currentMathContext
.static BigDecimal
subtract
(BigDecimal x, BigDecimal y) static BigDecimal
tan
(BigDecimal x) Calculates the tangens ofBigDecimal
x using the currentMathContext
.static BigDecimal
tanh
(BigDecimal x) Calculates the hyperbolic tangens ofBigDecimal
x using the currentMathContext
.static void
withLocalMathContext
(int precision, Runnable runnable) Executes the givenRunnable
using the specified precision.static void
withLocalMathContext
(int precision, RoundingMode roundingMode, Runnable runnable) Executes the givenRunnable
using the specified precision andRoundingMode
.static void
withLocalMathContext
(MathContext mathContext, Runnable runnable) Executes the givenRunnable
using the specifiedMathContext
.
-
Field Details
-
defaultMathContext
-
mathContextStack
-
-
Constructor Details
-
DefaultBigDecimalMath
public DefaultBigDecimalMath()
-
-
Method Details
-
createDefaultMathContext
-
pushMathContext
-
popMathContext
-
getIntSystemProperty
-
getRoundingModeSystemProperty
private static RoundingMode getRoundingModeSystemProperty(String propertyKey, RoundingMode defaultValue) -
propertyException
-
setDefaultMathContext
Sets the defaultMathContext
used if no otherMathContext
is defined usingwithLocalMathContext(MathContext, Runnable)
.- Parameters:
defaultMathContext
- the defaultMathContext
- See Also:
-
getDefaultMathContext
Returns the defaultMathContext
used for all mathematical functions in this class.- Returns:
- the default
MathContext
-
withLocalMathContext
Executes the givenRunnable
using the specified precision.- Parameters:
precision
- the precision to use for calculations in therunnable
runnable
- theRunnable
to execute
-
withLocalMathContext
public static void withLocalMathContext(int precision, RoundingMode roundingMode, Runnable runnable) Executes the givenRunnable
using the specified precision andRoundingMode
.- Parameters:
precision
- the precision to use for calculations in therunnable
roundingMode
- theRoundingMode
to use for calculations in therunnable
runnable
- theRunnable
to execute
-
withLocalMathContext
Executes the givenRunnable
using the specifiedMathContext
.- Parameters:
mathContext
- theMathContext
to use for calculations in therunnable
runnable
- theRunnable
to execute
-
createLocalMathContext
Executes the givenRunnable
using the specified precision.- Parameters:
precision
- the precision to use for calculations- Returns:
- the created
DefaultBigDecimalMath.LocalMathContext
to be used in a try-with-resources statement
-
createLocalMathContext
public static DefaultBigDecimalMath.LocalMathContext createLocalMathContext(int precision, RoundingMode roundingMode) Executes the givenRunnable
using the specified precision andRoundingMode
.- Parameters:
precision
- the precision to use for calculationsroundingMode
- theRoundingMode
to use for calculations in therunnable
- Returns:
- the created
DefaultBigDecimalMath.LocalMathContext
to be used in a try-with-resources statement
-
createLocalMathContext
public static DefaultBigDecimalMath.LocalMathContext createLocalMathContext(MathContext mathContext) Executes the givenRunnable
using the specifiedMathContext
.- Parameters:
mathContext
- theMathContext
to use for calculations- Returns:
- the created
DefaultBigDecimalMath.LocalMathContext
to be used in a try-with-resources statement
-
currentMathContext
Returns the currentMathContext
used for all mathematical functions in this class.The current
MathContext
is the lastMathContext
specified usingwithLocalMathContext(MathContext, Runnable)
or the defaultMathContext
if none was specified.- Returns:
- the current
MathContext
- See Also:
-
round
Rounds the specifiedBigDecimal
to the precision of the currentMathContext
.- Parameters:
value
- theBigDecimal
to round- Returns:
- the rounded
BigDecimal
value - See Also:
-
roundWithTrailingZeroes
Rounds the specifiedBigDecimal
to the precision of the currentMathContext
including trailing zeroes.- Parameters:
value
- theBigDecimal
to round- Returns:
- the rounded
BigDecimal
value including trailing zeroes - See Also:
-
add
- Parameters:
x
- the x valuey
- the y value to add- Returns:
- the resulting
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
subtract
- Parameters:
x
- the x valuey
- the y value to subtract- Returns:
- the resulting
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
multiply
- Parameters:
x
- the x valuey
- the y value to multiply- Returns:
- the resulting
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
divide
- Parameters:
x
- the x valuey
- the y value to divide- Returns:
- the resulting
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
remainder
- Parameters:
x
- the x valuey
- the y value to divide- Returns:
- the resulting
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
reciprocal
Calculates the reciprocal of the specifiedBigDecimal
using the currentMathContext
.- Parameters:
x
- theBigDecimal
- Returns:
- the reciprocal
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
factorial
Calculates the factorial of the specifiedBigDecimal
using the currentMathContext
.- Parameters:
x
- theBigDecimal
- Returns:
- the factorial
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
gamma
Calculates the gamma function of the specifiedBigDecimal
using the currentMathContext
.- Parameters:
x
- theBigDecimal
- Returns:
- the gamma
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
bernoulli
Calculates the Bernoulli number for the specified index using the currentMathContext
.- Parameters:
n
- the index of the Bernoulli number to be calculated (starting at 0)- Returns:
- the Bernoulli number for the specified index with the precision specified in the current
MathContext
- See Also:
-
pow
- Parameters:
x
- theBigDecimal
value to take to the powery
- theBigDecimal
value to serve as exponent- Returns:
- the calculated x to the power of y with the precision specified in the current
MathContext
- See Also:
-
pow
- Parameters:
x
- theBigDecimal
value to take to the powery
- thelong
value to serve as exponent- Returns:
- the calculated x to the power of y with the precision specified in the current
MathContext
- See Also:
-
sqrt
Calculates the square root ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
value to calculate the square root- Returns:
- the calculated square root of x with the precision specified in the current
MathContext
- See Also:
-
root
Calculates the n'th root ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
value to calculate the n'th rootn
- theBigDecimal
defining the root- Returns:
- the calculated n'th root of x with the precision specified in the current
MathContext
- See Also:
-
log
Calculates the natural logarithm ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the natural logarithm for- Returns:
- the calculated natural logarithm
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
log2
Calculates the logarithm ofBigDecimal
x to the base 2 using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the logarithm base 2 for- Returns:
- the calculated natural logarithm
BigDecimal
to the base 2 with the precision specified in the currentMathContext
- See Also:
-
log10
Calculates the logarithm ofBigDecimal
x to the base 10 using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the logarithm base 10 for- Returns:
- the calculated natural logarithm
BigDecimal
to the base 10 with the precision specified in the currentMathContext
- See Also:
-
pi
Returns the number pi using the currentMathContext
.- Returns:
- the number pi with the precision specified in the current
MathContext
- See Also:
-
e
Returns the number e using the currentMathContext
.- Returns:
- the number e with the precision specified in the current
MathContext
- See Also:
-
exp
Calculates the natural exponent ofBigDecimal
x (ex) using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the exponent for- Returns:
- the calculated exponent
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
sin
Calculates the sine (sinus) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the sine for- Returns:
- the calculated sine
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
asin
Calculates the arc sine (inverted sine) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the arc sine for- Returns:
- the calculated arc sine
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
cos
Calculates the cosine (cosinus) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the cosine for- Returns:
- the calculated cosine
BigDecimal
with the precision specified in the currentMathContext
-
acos
Calculates the arc cosine (inverted cosine) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the arc cosine for- Returns:
- the calculated arc sine
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
tan
Calculates the tangens ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the tangens for- Returns:
- the calculated tangens
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
atan
Calculates the arc tangens (inverted tangens) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the arc tangens for- Returns:
- the calculated arc tangens
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
atan2
Calculates the arc tangens (inverted tangens) ofBigDecimal
y / x in the range -pi to pi using the currentMathContext
.- Parameters:
y
- theBigDecimal
x
- theBigDecimal
- Returns:
- the calculated arc tangens
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
cot
Calculates the cotangens ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the cotangens for- Returns:
- the calculated cotanges
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
acot
Calculates the inverse cotangens (arc cotangens) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the arc cotangens for- Returns:
- the calculated arc cotangens
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
sinh
Calculates the hyperbolic sine ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the hyperbolic sine for- Returns:
- the calculated hyperbolic sine
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
cosh
Calculates the hyperbolic cosine ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the hyperbolic cosine for- Returns:
- the calculated hyperbolic cosine
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
tanh
Calculates the hyperbolic tangens ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the hyperbolic tangens for- Returns:
- the calculated hyperbolic tangens
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
coth
Calculates the hyperbolic cotangens ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the hyperbolic cotangens for- Returns:
- the calculated hyperbolic cotangens
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
asinh
Calculates the arc hyperbolic sine (inverse hyperbolic sine) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the arc hyperbolic sine for- Returns:
- the calculated arc hyperbolic sine
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
acosh
Calculates the arc hyperbolic cosine (inverse hyperbolic cosine) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the arc hyperbolic cosine for- Returns:
- the calculated arc hyperbolic cosine
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
atanh
Calculates the arc hyperbolic tangens (inverse hyperbolic tangens) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the arc hyperbolic tangens for- Returns:
- the calculated arc hyperbolic tangens
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-
acoth
Calculates the arc hyperbolic cotangens (inverse hyperbolic cotangens) ofBigDecimal
x using the currentMathContext
.- Parameters:
x
- theBigDecimal
to calculate the arc hyperbolic cotangens for- Returns:
- the calculated arc hyperbolic cotangens
BigDecimal
with the precision specified in the currentMathContext
- See Also:
-