If the precision of the basic integer and floating-point types is not sufficient, you can turn to a couple of handy classes in the java.math package: BigInteger and BigDecimal. These are classes for manipulating numbers with an arbitrarily long sequence of digits. The BigInteger class implements arbitrary precision integer arithmetic, and BigDecimal does the same for floating-point numbers. Use the static valueOf method to turn an ordinary number into a big number: BigInteger a = BigInteger.valueOf(100); Unfortunately, you cannot use the familiar mathematical operators such as + and * to combine big numbers. Instead, you must use methods such as add and multiply in the big number classes. BigInteger c = a.add(b); // c = a + b BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); // d = c * (b + 2) C++ NOTE
Example 3-6 shows a modification of the lottery odds program of Example 3-5, updated to work with big numbers. For example, if you are invited to participate in a lottery in which you need to pick 60 numbers out of a possible 490 numbers, then this program will tell you that your odds are 1 in 716395843461995557415116222540092933411717612789263493493351013459481104668848. Good luck! The program in Example 3-5 computed the statement: lotteryOdds = lotteryOdds * (n - i + 1) / i; When big numbers are used, the equivalent statement becomes: lotteryOdds = lotteryOdds.multiply(BigInteger.valueOf(n - i + 1)).divide(BigInteger .valueOf(i)); Example 3-6. BigIntegerTest.java1. import java.math.*; 2. import java.util.*; 3. 4. public class BigIntegerTest 5. { 6. public static void main(String[] args) 7. { 8. Scanner in = Scanner.create(System.in); 9. 10. System.out.print("How many numbers do you need to draw? "); 11. int k = in.nextInt(); 12. 13. System.out.print("What is the highest number you can draw? "); 14. int n = in.nextInt(); 15. 16. /* 17. compute binomial coefficient 18. n * (n - 1) * (n - 2) * . . . * (n - k + 1) 19. ------------------------------------------- 20. 1 * 2 * 3 * . . . * k 21. */ 22. 23. BigInteger lotteryOdds = BigInteger.valueOf(1); 24. 25. for (int i = 1; i <= k; i++) 26. lotteryOdds = lotteryOdds 27. .multiply(BigInteger.valueOf(n - i + 1)) 28. .divide(BigInteger.valueOf(i)); 29. 30. System.out.println("Your odds are 1 in " + lotteryOdds + 31. ". Good luck!"); 32. } 33. } java.math.BigInteger 1.1
java.math.BigDecimal 1.1
|