15036188778

您所在位置: 首页> 学习课程> java培训 | java高精度,我学会了

java培训 | java高精度,我学会了

发布百知教育 来源:学习课程 2019-10-15

高精度整数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类来计算。
  1. public static void main(String[] args) {

  2.    float f1 = 123.01f + 2.01f;

  3.    // 预期输出:125.02,实际输出:125.020004

  4.    System.out.println(f1);

  5.    // 预期输出:125.02,实际输出:125.02000000000001

  6.    System.out.println(123.01 + 2.01);

  7.    System.out.println("===============================");


  8.    // 高精度整数测试

  9.    BigInteger bint1 = new BigInteger("125");

  10.    BigInteger bint2 = new BigInteger("999");

  11.    BigInteger tmp;

  12.    // 相加

  13.    tmp = bint1.add(bint2);

  14.    System.out.println("bint1 + bint2 = " + tmp);

  15.    // 相减

  16.    tmp = bint2.subtract(bint1);

  17.    System.out.println("bint2 - bint1 = " + tmp);

  18.    // 相乘

  19.    tmp = bint1.multiply(bint2);

  20.    System.out.println("bint1 * bint2 = " + tmp);

  21.    // 相除

  22.    tmp = bint2.divide(bint1);

  23.    System.out.println("bint2 / bint1 = " + tmp);

  24.    // 求余数

  25.    tmp = bint2.remainder(bint1);

  26.    System.out.println("bint2 % bint1 = " + tmp);

  27.    // 求次方

  28.    tmp = bint2.pow(2);

  29.    System.out.println("bint2的二次方 = " + tmp);

  30.    System.out.println("======================================");


  31.    // 高精度小数测试

  32.    BigDecimal bd1 = new BigDecimal(123.01);

  33.    BigDecimal bd2 = new BigDecimal(2.01);

  34.    BigDecimal bd;

  35.    // 相加

  36.    bd = bd1.add(bd2);

  37.    System.out.println("bd1 + bd2 = " + bd);

  38.    // 相减

  39.    bd = bd1.subtract(bd2);

  40.    System.out.println("bd2 - bd1 = " + bd);

  41.    // 相乘

  42.    bd = bd1.multiply(bd2);

  43.    System.out.println("bd1 * bd2 = " + bd);

  44.    // 相除

  45.    // bd = bd1.divide(bd2);

  46.    bd = bd1.divide(new BigDecimal(2.0));

  47.    System.out.println("bd1 / 2.0 = " + bd);

  48.    // 求余数

  49.    bd = bd1.remainder(bd2);

  50.    System.out.println("bd2 % bd1 = " + bd);

  51.    // 求次方

  52.    bd = bd1.pow(3);

  53.    System.out.println("bd2的三次方 = " + bd);

  54.    System.out.println("======================================");


  55.    // 四舍五入保留小数位数

  56.    BigDecimal bd3 = new BigDecimal(123.01).setScale(5,5);

  57.    System.out.println("bd3 = " + bd3);

  58.  }



java培训班:http://www.baizhiedu.com/java2019



上一篇:java培训 | void关键字到底是什么类型?

下一篇:应届生去公司找个Java程序员的职位需要什么技能?

相关推荐

www.baizhiedu.com

有位老师想和您聊一聊

关闭

立即申请