高精度整数BigInteger
Java的API中的描述(最主要的部分):
不可变的任意精度的整数。所有操作中,都以二进制补 码形式表示 BigInteger(如 Java 的基本整数类型)。 BigInteger提供所有 Java 的基本整数操作符的对应物, 并提供 java.lang.Math 的所有相关方法。另外, BigInteger 还提供以下运算:模算术、GCD 计算、质 数测试、素数生成、位操作以及一些其他操作。
BigInteger可以表示任意大小的整数,并且可以像我们使用int之类的数字一样正常的进行计算。只不过加减乘除之类的操作都换成了方法调用,要注意的是BigXXXXX是不可变的,也就是说每次进行运算都会产生新的对象来进行计算,所以应该避免大规模的使用,主要的方法有:
案例一
String temp1 = "-100000000000000000000000000"; BigInteger bg1 = new BigInteger(temp1); //注意初始化的方式,使用字符串来初始化 System.out.println(bg1.abs()); //绝对值方法 object.abs() String temp2 = "100000000000000000000000000"; BigInteger bg2 = new BigInteger(temp2); System.out.println(bg1.add(bg2)); //加法 object.add(BigInteger b) System.out.println(bg1.subtract(bg2)); //减法 返回为 bg1 - bg2 (this - param) System.out.println(bg1.multiply(bg2)); //乘法 返回 bg1 * bg2 System.out.println(bg1.divide(bg2)); //除法 返回bg1 / bg2 System.out.println(bg1.mod(bg2)); //取模运算 返回的是 bg1%bg2 (this mod param) System.out.println(bg1.gcd(bg2)); //直接封装好了 求解bg1,bg2 的最大公约数 int temp5 = 5; System.out.println(bg2.pow(temp5)); //乘方运算 注意这个方法的参数是基本类型int System.out.println(bg2.compareTo(bg1)); // 比较方法 结果为1 bg2大 System.out.println(bg1.compareTo(bg2)); // 结果为-1 bg2大 //这个地方注意比较的方法,还有一个方法是equal() String temp3 = "1000"; String temp4 = "001000"; BigInteger bg3 = new BigInteger(temp3); BigInteger bg4 = new BigInteger(temp4); System.out.println(bg3.compareTo(bg4)); //结果为0 表示相等 System.out.println(bg3.equals(bg4)); //返回结果为true ,这样是没有区别,但是更推荐compareTo()方法 //在BigDecimal更直观,例如0.1 与0.10 ,equal返回false 而compareTo则是正确的结果。
除了这些方法之外还提供了位运算,质数测试等等方法 Java API高精度浮点数BigDecimal先来看一下BigDecimal 的构造函数(比BigInteger可多多了)
案例二
主要的方法:
String temp1 = "1.2222222222222222222222222"; BigDecimal bd1 = new BigDecimal(temp1); String temp2 = "2.333333333333333333333333"; BigDecimal bd2 = new BigDecimal(temp2); System.out.println(bd1.add(bd2)); // 加法 输出 3.5555555555555555555555552 System.out.println(bd1.add(bd2).doubleValue()); // 输出3.5555555555555554 这里用了一个方法将结果转化为double类型了 System.out.println(bd2.subtract(bd1)); //减法 输出 1.1111111111111111111111108 System.out.println(bd2.subtract(bd1).doubleValue()); //输出 1.1111111111111112 System.out.println(bd2.multiply(bd1)); //乘法 输出 2.8518518518518518518518513925925925925925925925926 System.out.println(bd2.multiply(bd1).doubleValue()); //乘法 2.8518518518518516 System.out.println(bd2.divide(bd1, 5, RoundingMode.HALF_UP)); //除法应该注意很有可能会有除不尽的情况, //这时候会有异常抛出,所以要传入控制参数 System.out.println(bd2.divide(bd1, 5, RoundingMode.HALF_UP).doubleValue()); //输出都是 1.90909 System.out.println(bd1.compareTo(bd2)); //比较方法 BigDecimal bd3 = new BigDecimal("1.20"); BigDecimal bd4 = new BigDecimal("1.2"); System.out.println(bd3.compareTo(bd4)); //返回0表示相等 System.out.println(bd3.equals(bd4)); //返回的是false 是错误的//所以比较的时候使用compareTo()方法
案例三
当两个float型的数字相加,得到的结果和我们的预期结果是有误差的,为了减小和防止这种误差的出现,我们需要使用BigInteger类和BigDecimal类来计算。
public static void main(String[] args) {
float f1 = 123.01f + 2.01f;
// 预期输出:125.02,实际输出:125.020004
System.out.println(f1);
// 预期输出:125.02,实际输出:125.02000000000001
System.out.println(123.01 + 2.01);
System.out.println("===============================");
// 高精度整数测试
BigInteger bint1 = new BigInteger("125");
BigInteger bint2 = new BigInteger("999");
BigInteger tmp;
// 相加
tmp = bint1.add(bint2);
System.out.println("bint1 + bint2 = " + tmp);
// 相减
tmp = bint2.subtract(bint1);
System.out.println("bint2 - bint1 = " + tmp);
// 相乘
tmp = bint1.multiply(bint2);
System.out.println("bint1 * bint2 = " + tmp);
// 相除
tmp = bint2.divide(bint1);
System.out.println("bint2 / bint1 = " + tmp);
// 求余数
tmp = bint2.remainder(bint1);
System.out.println("bint2 % bint1 = " + tmp);
// 求次方
tmp = bint2.pow(2);
System.out.println("bint2的二次方 = " + tmp);
System.out.println("======================================");
// 高精度小数测试
BigDecimal bd1 = new BigDecimal(123.01);
BigDecimal bd2 = new BigDecimal(2.01);
BigDecimal bd;
// 相加
bd = bd1.add(bd2);
System.out.println("bd1 + bd2 = " + bd);
// 相减
bd = bd1.subtract(bd2);
System.out.println("bd2 - bd1 = " + bd);
// 相乘
bd = bd1.multiply(bd2);
System.out.println("bd1 * bd2 = " + bd);
// 相除
// bd = bd1.divide(bd2);
bd = bd1.divide(new BigDecimal(2.0));
System.out.println("bd1 / 2.0 = " + bd);
// 求余数
bd = bd1.remainder(bd2);
System.out.println("bd2 % bd1 = " + bd);
// 求次方
bd = bd1.pow(3);
System.out.println("bd2的三次方 = " + bd);
System.out.println("======================================");
// 四舍五入保留小数位数
BigDecimal bd3 = new BigDecimal(123.01).setScale(5,5);
System.out.println("bd3 = " + bd3);
}
java培训班:http://www.baizhiedu.com/java2019