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.