Java笔记——数学类

数学类

数学类没什么难点,只需要记住相关方法即可

Math

        // 圆周率
        System.out.println(Math.PI);
        // 自然指数
        System.out.println(Math.E);
        // 绝对值
        System.out.println(Math.abs(-10));
        // 立方根
        System.out.println(Math.cbrt(27));
        // 平方根
        System.out.println(Math.sqrt(9));
        // 向上取整
        System.out.println(Math.ceil(3.74));
        // 向下取整
        System.out.println(Math.floor(-3.4));
        // 加权函数a的b次方
        System.out.println(Math.pow(3,4));
        // 获取随机数  [100000,1000000)
        System.out.println(Math.random());
        // 四舍五入
        System.out.println(Math.round(3.5));

BigDecimal

  • BigDecimal是用于精确计算的类,其内部包含两种数据类型来表示一个数值

BigInteger:用于存储数值的整数部分(即非指数部分),它可以表示任意大小的整数,很适合用来存储大数值

int:用于存储数值的小数点位置,也就是scale(标度),scale表示的是小数点后面的有效零的个数。例如123.45有两位小数,它的标度就为2

这个数组用来保存小数部分,每个元素都是BigDecimal的对象,其中第一个参数是value,他的范围是0到10
第二个参数scale表示标度,即小数的位数,由于这个数组仅存储整数部分,所以scale全部是0
第三个参数precision表示精度,即数值的总位数,整数0-9时precision都为1,而10则为2

这么做可以将常用的BigDecimal对象预存到一个数组中,减少程序运行时对相同的BigDecimal对象的创建次数,同时这么做还能在代码中直接引用,而不需要重新创建对象,提高了代码的运行效率和简洁性


这个数组用来保存小数部分,其中第一个参数是 BigInteger.ZERO,表示整数部分为0
第三个参数是value,它始终为0,因为对于小数部分而言整数部分都是0
第三个参数是scale,表示小数点后的位数,它可以是1到15,也就是最多可以精确到小数点后15位
第四个参数是precision,表示精度,即数值的总位数,由于整数部分为0,这里的精度始终为1,只有小数部分的一位


值得注意的是,其中0、1、2、10这四个数来自Math中的BigInteger类


调用BigDecimal类时,需要传入字符串数据进行运算:

        BigDecimal bigDecimal = new BigDecimal("3.0");
        BigDecimal bigDecimal1 = new BigDecimal("2.0");
        // 加法
        System.out.println(bigDecimal.add(bigDecimal1));
        // 减法
        System.out.println(bigDecimal.subtract(bigDecimal1));
        // 乘法
        System.out.println(bigDecimal.multiply(bigDecimal1));
        // 除法  要求能够获取精确结果
        System.out.println(bigDecimal.divide(bigDecimal1));

BigInteger

这个类用来处理那些超过了基本整数类型,如int或long所能表示的最大值。普遍应用于加密算法或者财务计算等需要大额数值的场景,他的位数理论上是不设限的,取决于计算机的内存大小,但过高的位数会导致程序运行效率降低

使用BigInteger完成乘法运算示例:

        BigInteger bigInteger1 = new BigInteger("987654334326756");
        BigInteger bigInteger2 = new BigInteger("98765435");
        System.out.println(bigInteger1.multiply(bigInteger2));

DecimalFormat

DecimalFormat提供了格式化和解析数字字符串的方法,DecimalFormat是NumberFormat的子类,允许对数字格式化有更多的控制,比如指定小数点后的位数、使用千位分隔符、货币符号等

以下是常用模式字符:
0 表示一个数字,包括前导零。
# 表示一个数字,不包括前导零。
. 表示小数点。
, 表示千位分隔符。
Ee 表示指数记号。
% 表示百分比,即乘以 100 后加上 % 符号。
; 用于分隔正数和负数的格式模式。
- 表示负号。
( ) 表示负数的括号。

以下是基本使用示例,我使用注释进行介绍:

    double d = 12345.678;
    // 创建对象指定数字显示的格式
    // 0代表占位符,表示一位数字,如果这一位没有数字,用0填充
    DecimalFormat decimalFormat1 = new DecimalFormat("00000.0000");
    System.out.println(decimalFormat1.format(d));   //结果:12345.6780

    DecimalFormat decimalFormat2 = new DecimalFormat("####0.0###");
    // #是一个占位符,表示一位数字,这一位如果没有数字,那么就不填充内容
    System.out.println(decimalFormat2.format(d));   //结果:12345.678

    String s = "1,234,567.89";
    //格式化数字字符串
    DecimalFormat decimalFormat3 = new DecimalFormat("#,#.#");
    Number number  = decimalFormat3.parse(s);
    System.out.println(number.doubleValue());       //结果:1234567.89

    double d2 = 567546436546342L;
    // 科学计数法
    DecimalFormat decimalFormat4 = new DecimalFormat("0.00E0");
    System.out.println(decimalFormat4.format(d2));  //结果:5.68E14

    d = 1234567.89;
    //自定义数字的格式符号,例如千分位符和小数点符号
    DecimalFormatSymbols symbols = new DecimalFormatSymbols();
    symbols.setGroupingSeparator(' ');
    symbols.setDecimalSeparator(',');
    //作为参照
    DecimalFormat decimalFormat5 = new DecimalFormat("###,###.##");
    DecimalFormat decimalFormat6 = new DecimalFormat("###,###.##", symbols);
    System.out.println(decimalFormat5.format(d));   //结果:1,234,567.89
    System.out.println(decimalFormat6.format(d));   //结果:1 234 567,89

运行截图:


思考:两个千位数字相乘,有几种方案?最高效的是?