欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础类库--数字操作类

程序员文章站 2022-05-22 12:37:51
...

内容学习于:edu.aliyun.com


具体内容:

  程序就是一个数学的处理过程,所以在Java语言本身也提供有相应的数字处理的类库支持。

1. Math数字计算类

  Math类的主要功能是进行数学计算的操作类,提供有基础的计算公式,这个类的构造方法被私有化了,而且该类之中提供的所有方法都是static型的方法,即:这些方法都可以通过类名称直接调用。

操作代码:

public class JavaAPIDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        System.out.println(Math.abs(-10.1));//10.1
        System.out.println(Math.max(10.2,20.3));//20.3
        System.out.println(Math.log(5));//1.6094379124341003
        System.out.println(Math.round(15.1));//15
        System.out.println(Math.round(-15.1));//15
        System.out.println(Math.round(-15.5));//15
        System.out.println(Math.round(-15.51));//16
        System.out.println(Math.pow(10.1,20.2));//1.9377232508118457E20
    }
}

结果:

10.1
20.3
1.6094379124341003
15
-15
-15
-16
1.9377232508118457E20

  虽然在Math类里面提供有四舍五入的处理方法,但是这个四舍五入字在进行处理的时候是直接将小数点后的所有位进行进位处理了,这样肯定不方便,那么现在最方便的做法是可以实现指定位数的保留。

自定义四舍五入操作代码:

class MyMath {
    private MyMath() {
    }//构造方法私有化

    /**
     * 实现四舍五入操作
     *
     * @param num   要进行四舍五入的数字
     * @param scale 四舍五入的位数
     * @return 四舍五入后的结果
     */
    public static double round(double num, int scale) {
        return Math.round(num * Math.pow(10, scale)) / Math.pow(10, scale);
    }
}

public class JavaAPIDemo {
    public static void main(String[] args) {
        System.out.println(MyMath.round(19.86524, 2));
    }
}

结果:

19.87

  Math类里面提供的基本上都是基础的数学公式,需要的时候需要自己重新整合。

2. Random随机数生成类

  java.util.Random类的主要功能是产生随机数的,这个类主要是依靠内部提供的方法来完成:
产生一个不大于边界的随机正整数:public int nextInt(int bound)

产生随机数代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        Random rand = new Random();
        for (int i = 0; i < 10; i++) {
            System.out.printf(rand.nextInt(100) + "、");
        }
    }
}

结果:

63、97、79、80、0、63、55、82、31、32、

  在国内有一款神奇的所谓的 36选7的**,那么就可以利用Random实现随机生成**号。

  • 对于这里面的数字肯定不能有0,不能够重复;

随机生成36选7**号代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        Random rand = new Random();
        int data[] = new int[7];
        int foot = 0;//操作data的角标
        while (foot < 7) {//选择7个数字
            int num = rand.nextInt(36);//产生一个不大于36的随机数
            if (isUse(num, data)) {//判断数字是否能使用
                data[foot++] = num;//保存数据
            }
        }
        java.util.Arrays.sort(data);
        for (int temp : data) {
            System.out.print(temp + "、");
        }
    }

    /**
     * 判断传入的数字是否为0,并且以及是否在数组之中出现
     *
     * @param num  传入的数字
     * @param data 已经出现的数字
     * @return 如果这个数字可以使用,返回true;否则返回false
     */
    public static boolean isUse(int num, int data[]) {
        if (num == 0) {
            return false;
        }
        for (int i = 0; i < data.length; i++) {
            if (num == data[i])
                return false;
        }
        for (int temp : data) {
            if (num == temp)
                return false;
        }
        return true;
    }
}

结果:

2、9、14、22、23、24、29、

3. 大数处理类

  在进行数学计算的过程里面还有一个大数字的操作类,可以实现海量数字的计算( 能提供的也只是基础计算),现在假设一个数字很大,超过了double范围,那么这个时候并没有任何一种数据类型可以保存下此类的内容,最早的时候只能够通过String保存。
如果现在要想进行加法计算,那么就需要逐位拆分,每一位自己计算,而后自己独立控制进位处理,那么这样的开发难度是非常高的,所以为了解决这类问题,提供有两个大数字的操作类: BigInteger. BigDecimal.

  • BigInteger构造:public BigInteger(String val)
  • BigDecimal构造:public BigDecimal(String val)

  如下图所示:Java基础类库--数字操作类

BigInteger 四则运算代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        BigInteger bigA = new BigInteger("136536443464895461113");
        BigInteger bigB = new BigInteger("84584994487");
        System.out.println("【加法操作】:" + bigA.add(bigB));
        System.out.println("【减法操作】:" + bigA.subtract(bigB));
        System.out.println("【除法操作】:" + bigA.divide(bigB));
        System.out.println("【乘法操作】:" + bigA.multiply(bigB));
    }

}

结果:

【加法操作】:136536443549480455600
【减法操作】:136536443380310466626
【除法操作】:1614192260
【乘法操作】:11548934317752769756274427884031

代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        BigInteger bigA = new BigInteger("136536443464895461113");
        System.out.println(bigA.pow(Integer.MAX_VALUE));
    }
}

结果:

  如下图所示:Java基础类库--数字操作类

  此时的计算过程是非常缓慢的,所以任何的电脑都是有极限的。既然在进行数学除法的时候有可能无法进行整除处理,那么就可以使用其它的除法计算来求出余数:

  • 求余:public BigInteger[] divideAndRemainder(BigInteger val)

代码:

public class JavaAPIDemo {
    public static void main(String[] args) {
        BigInteger bigA = new BigInteger("136536443464895461113");
        BigInteger bigB = new BigInteger("84584994487");
        BigInteger result[] = bigA.divideAndRemainder(bigB);
        System.out.println("【商】:" + result[0] + "、【余数】:" + result[1]);
    }

}

结果:

【商】:1614192260、【余数】:51837390493

  如果在开发中真进行计算的时候,该计算没有超过基本数据类型所包含的位数强烈不建议使用大数字类,因为这种计算性能很差的。BigDecimal操作形式和BigInteger是非常类似的,都有基础的数学支持。

  但是在使用BigDecimal的时候有一个数据进位问题, 在这个类里面定义有如下的除法计算:

BigDecimal:

  • 除法:public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

实现四舍五入处理代码:

class MyMath {
    private MyMath() {
    }//构造方法私有化

    public static double round(double num, int scale) {
        return new BigDecimal(num).divide(new BigDecimal(1.0), scale, RoundingMode.HALF_UP).doubleValue();
    }
}


public class JavaAPIDemo {
    public static void main(String[] args) {
        System.out.println(MyMath.round(19.463846, 2));
    }

}

结果:

19.46

  Math的处理由于使用的都是基本数据类型,所以性能一定要高于大数字处理类的。