Handling Very Large Numbers
Problem
You
need to handle integer numbers larger than
Long.MAX_VALUE
or
floating-point
values larger than Double.MAX_VALUE
.
Solution
Use the BigInteger
or
BigDecimal
values in package
java.math
:
// BigNums.java System.out.println("Here's Long.MAX_VALUE: " + Long.MAX_VALUE); BigInteger bInt = new BigInteger("3419229223372036854775807"); System.out.println("Here's a bigger number: " + bInt); System.out.println("Here it is as a double: " + bInt.doubleValue( ));
Note that the constructor takes the number as a string. Obviously you
couldn’t just type the numeric digits, since by definition
these classes are designed to represent numbers larger than will fit
in a Java long
.
Discussion
Both BigInteger
and BigDecimal
objects are immutable; that is, once constructed,
they always represent a given number. That said, there are a number
of methods that return new objects that are mutations of the
original, such as negate( )
, which returns the negative of the
given BigInteger
or BigDecimal
.
There are also methods corresponding to most of the Java language
built-in operators defined on the base types
int
/long
and
float
/double
. The division
method makes you specify the rounding method; consult a book on
numerical analysis for details. Here is a simple
stack-based calculator using
BigDecimal
as its numeric data type:
import java.math.BigDecimal; import java.util.Stack; /** A trivial reverse-polish stack-based calculator for big numbers */ public class BigNumCalc ...
Get Java Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.