JAVA的两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,理论上能够表示无限大的数。
BigInteger表示:
package com.xujin;
import java.util.*;
import java.math.*;
public class Test {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
//BigInteger类型的常量
BigInteger A = BigInteger.ONE;
System.out.println("BigInteger.ONE的结果为 " + A);//1
BigInteger B = BigInteger.TEN;
System.out.println("BigInteger.TEN的结果为 " + B);//10
BigInteger C = BigInteger.ZERO;
System.out.println("BigInteger.ZERO的结果为 " + C);//0
//初始化
BigInteger c = new BigInteger("12345670",8);//c = 01234567890 ,八进制
System.out.println(c);//2739128
BigInteger d = BigInteger.valueOf(100);//d = 100
BigInteger e = new BigInteger(new byte[]{1,0});//00000001 00000000
System.out.println(e);//256
System.out.println(e.bitCount());
System.out.println(e.bitLength());
//运算
System.out.println("请输入大整数a,b");
while (cin.hasNext()) {//等同于!=EOF
BigInteger a = cin.nextBigInteger();
BigInteger b = cin.nextBigInteger();
BigInteger c1 = a.add(b); // 大数加法
System.out.println("加的结果为 " + c1);
BigInteger c2 = a.subtract(b); // 大数减法
System.out.println("减的结果为 " + c2);
BigInteger c3 = a.multiply(b); // 大数乘法
System.out.println("乘的结果为 " + c3);
BigInteger c4 = a.divide(b); // 大数除法
System.out.println("除的结果为 " + c4);
BigInteger c5 = a.mod(b);
System.out.println("模的结果为 " + c5);
BigInteger cc5 = a.remainder(b);
System.out.println("余的结果为 " + cc5);
BigInteger c6 = a.max(b);// 取最大
System.out.println("最大为 " + c6);
BigInteger c7 = a.min(b); // 取最小
System.out.println("最小为 " + c7);
BigInteger c8 = a.pow(10); //指数运算
System.out.println("指数运算结果为" + c8);
if (a.equals(b)) // 判断是否相等
System.out.println("相等");
else
System.out.println("不相等");
BigInteger c10 = a.abs(); // 求绝对值
System.out.println("a的绝对值为 " + c10);
BigInteger c11 = a.negate(); // 求相反数
System.out.println("a的相反数为 " + c11);
}
}
}
BigDecimal表示:
//创建BigDecimal对象
BigDecimal bigNumber = new BigDecimal("89.1234567890123456789");
BigDecimal bigRate = new BigDecimal(1000);
BigDecimal bigResult = new BigDecimal(); //对象bigResult的值为0.0
注意,BigDecimal中的divide函数和BigInteger中的稍有不同。
方法1:pubilc BigDecimal divide(BigDecimal divisor)
API中的解释: 返回一个 BigDecimal,其值为 (this / divisor),其首选标度为 (this.scale() - divisor.scale());如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException。
方法2:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
scale指的是小数点后的位数。比如123.456则scale就是3,是BigDecimal类中的方法啊。比如:BigDecimal b = new BigDecimal("123.456");//b.scale(),返回的就是3.roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)的意思是说:我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式,是四舍五入啊还是其它的,你可以自己选!
方法3:pubilc BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
Fields
final public static BigDecimal
ZERO
since
1.5
final public static BigDecimal
ONE
since
1.5
final public static BigDecimal
TEN
since
1.5
final public static int
ROUND_UP
final public static int
ROUND_DOWN
final public static int
ROUND_CEILING
BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。注意,此舍入模式始终不会减少计算值。
final public static int
ROUND_FLOOR
BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。注意,此舍入模式始终不会增加计算值。
final public static int
ROUND_HALF_UP
ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。注意,这是我们大多数人在小学时就学过的舍入模式。
final public static int
ROUND_HALF_DOWN
ROUND_UP相同;否则舍入行为与 ROUND_DOWN 相同。
final public static int
ROUND_HALF_EVEN
ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
final public static int
ROUND_UNNECESSARY
ArithmeticException。
与上面的大整数同样的函数:
package com.xujin;
import java.util.*;
import java.math.*;
public class Test {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
//BigDecimal类型的常量
BigDecimal A = BigDecimal.ONE;
System.out.println("BigDecimal.ONE的结果为 " + A);//1
BigDecimal B = BigDecimal.TEN;
System.out.println("BigDecimal.TEN的结果为 " + B);//10
BigDecimal C = BigDecimal.ZERO;
System.out.println("BigDecimal.ZERO的结果为 " + C);//0
//初始化
BigDecimal c = new BigDecimal("89.1234567890123456789");
BigDecimal d = new BigDecimal(100);
BigDecimal e = new BigDecimal(new char[]{'2','1','.','2'});
System.out.println(e);//21.2
//运算
System.out.println("请输入大整数a,b");
while (cin.hasNext()) {//等同于!=EOF
BigDecimal a = cin.nextBigDecimal();
BigDecimal b = cin.nextBigDecimal();
BigDecimal c1 = a.add(b); // 大数加法
System.out.println("加的结果为 " + c1);
BigDecimal c2 = a.subtract(b); // 大数减法
System.out.println("减的结果为 " + c2);
BigDecimal c3 = a.multiply(b); // 大数乘法
System.out.println("乘的结果为 " + c3);
//注意,这里如果不能除尽,就会抛出一个ArithmeticException错误
BigDecimal c4 = a.divide(b); // 大数除法
System.out.println("除的结果为 " + c4);
BigDecimal cc5 = a.remainder(b);
System.out.println("余的结果为 " + cc5);
BigDecimal c6 = a.max(b);// 取最大
System.out.println("最大为 " + c6);
BigDecimal c7 = a.min(b); // 取最小
System.out.println("最小为 " + c7);
BigDecimal c8 = a.pow(10); //指数运算
System.out.println("指数运算结果为" + c8);
if (a.equals(b)) // 判断是否相等
System.out.println("相等");
else
System.out.println("不相等");
BigDecimal c10 = a.abs(); // 求绝对值
System.out.println("a的绝对值为 " + c10);
BigDecimal c11 = a.negate(); // 求相反数
System.out.println("a的相反数为 " + c11);
}
}
}
实用格式转换:
//去后缀0
BigDecimal bd = new BigDecimal("12000.87300");
bd = bd.stripTrailingZeros();
System.out.println(bd);
bd = new BigDecimal("1.2E-3");
// bd = new BigDecimal("1.2E+3");
//去科学记数
if(bd.scale()<0){
bd = bd.setScale(0);
}
System.out.println(bd);
//保留N位小数. N=5:
bd = new BigDecimal("12000.873000");
bd = bd.setScale(5, BigDecimal.ROUND_HALF_UP);
System.out.println(bd);
参考资料:
java API http://doc.java.sun.com/DocWeb/api/java.math.BigDecimal
http://blog.163.com/wangyongfei_2008@yeah/blog/static/1722383292011535174177/ http://qingfengxia2.blog.163.com/blog/static/25478407201012442119977/ http://www.cnblogs.com/ffjjqqjj/archive/2011/07/14/2105893.html 等