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 ...