Java Math、BigDecimal和BigInteger类常用方法

与数学相关的三个常用类

Math 类:Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。都是静态方法,使用不多.

BigDecimal 类:float和double都不能表示精确的小数,此时使用 BigDecimal类,用于处理金钱和精度要求高的数据.

BigInteger 类:表示大整型,如果两个long类型的最大值相运算,结果long再也存储不下,此时使用BigInteger,一般不用.

一、Math 类

有两个常量

      

方法等:

    • static doubleabs(double a)

      返回值为 double绝对值。

      static doubleceil(double a)

      返回大于或等于参数的最小(最接近负无穷大) double值,等于一个数学整数。

      static doublefloor(double a)

      返回小于或等于参数的最大(最接近正无穷大) double值,等于一个数学整数。

      static floatmax(float a, float b)

      返回两个 float的较大值。

      static intmin(int a, int b)

      返回两个 int的较小值。

      static doublerandom()

      返回值为 double值为正号,大于等于 0.0 ,小于 1.0

      static doublerint(double a)

      返回与参数最接近值的 double值,并且等于数学整数。

      static longround(double a)

      返回参数中最接近的 long ,其中 long四舍五入为正无穷大。

      static intround(float a)

      返回参数中最接近的 int ,其中 int四舍五入为正无穷大。

测试 demo

    public static void main(String[] args) {
        /**
         *  Math.abs(); 求绝对值
         *  参数支持:double float 和int
         */
        System.out.println("绝对值:" + Math.abs(-10.5)); // 10.5
        System.out.println("绝对值:" + Math.abs(10.4));  // 10.4

        /**
         *  Math.max(); 求最大值
         *  Math.min(); 求最小值
         *  参数支持:double float long和int
         * */
        System.out.println("最大值:" + Math.max(100L, 99L));       // 100
        System.out.println("最小值:" + Math.min(-10.5f, -10.4f));  // -10.5

        /**
         *  Math.ceil(); 天花板的意思,返回向上取整数(取最大值)
         */
        System.out.println("值:" + Math.ceil(-10.1)); // -10
        System.out.println("值:" + Math.ceil(10.1));  // 11

         /**
         *  Math.floor(); 地板的意思,返回向下取整数(取最小值)
         */
        System.out.println("值:" + Math.floor(-10.1)); // -11
        System.out.println("值:" + Math.floor(10.1));  // 10

        /**
         * Math.random(); 返回一个在 [0,1) 内的随机数double值
         */
        System.out.println("[0,1)值:" + Math.random());     // 0.5498044946067191
        System.out.println("[49,100)值:" + (Math.random() * 51 + 49));  // 78.0217677789672

        /**
         * Math.rint(); 四舍五入
         * 返回double值
         */
        System.out.println("四舍五入值:" + Math.rint(-10.5)); // -10.0  
        System.out.println("四舍五入值:" + Math.rint(-10.51)); // -11  
        System.out.println("四舍五入值:" + Math.rint(10.4));  // 10.0

        /**
         * Math.round() 四舍五入
         * float时返回int值,double时返回long值
         */
        System.out.println("四舍五入值:" + Math.round(-10.5)); // -10
        System.out.println("四舍五入值:" + Math.round(-10.51)); // -11
        System.out.println("四舍五入值:" + Math.round(10.4f));  // 10
    }

二、BigDecimal 类

       Java 中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算。其中:

       BigInteger 类是针对大 整数的处理类,而 BigDecimal 类则是针对大 小数的处理类.

       BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念.

       float 和 Double 只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigInteger 类和   BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值.

       BigDecimal 类创建的是对象,不能使用传统的+、-、*、/等算术运算符直接对其进行数学运算,而必须调用其对应的方法。方法的参数也必须是BigDecimal类型的对象.

1、构造 BigDecimal 对象常用方法

      

       

  

注意:

       1)double 参数的构造方法,不允许使用!因为它不能精确的得到相应的值,值会变大;

       2)String 构造方法是完全可预知的: 写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的0.1; 因此,通常建议优先使用 String 构造方法;

       3) 静态方法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的首选方法;

       4)  BigDecimal 类 覆写了 toString 方法

    

    public static void main(String[] args) {
        double d1 = 0.1;
        double d2 = 100.1;

        // 此方式绝对不允许使用!
        System.out.println(new BigDecimal(d1)); // 0.1000000000000000055511151231257827021181583404541015625
        System.out.println(new BigDecimal(d2)); // 100.099999999999994315658113919198513031005859375

        System.out.println(new BigDecimal("0.1"));  // 0.1
        System.out.println(new BigDecimal("100.0"));// 100.1

        BigDecimal b1 = BigDecimal.valueOf(d1); // 0.1
        BigDecimal b2 = BigDecimal.valueOf(d2); // 100.1
        System.out.println(b1); // 0.1
        System.out.println(b2); // 100.1

        System.out.println(new BigDecimal(String.valueOf(d1)));  // 0.1
        System.out.println(new BigDecimal(String.valueOf(d2)));  // 100.1
        System.out.println(new BigDecimal(Double.toString(d1))); // 0.1
        System.out.println(new BigDecimal(Double.toString(d2))); // 100.1
    }

1、简单加减乘等计算方法

    public static void main(String[] args) {
        double d1 = 0.2;
        double d2 = 100.2;
        BigDecimal b1 = BigDecimal.valueOf(d1); // 0.2
        BigDecimal b2 = BigDecimal.valueOf(d2); // 100.2
        /**
         * 精确计算
         */
        System.out.println(b1.add(b2));      // 加法 100.4
        System.out.println(b1.subtract(b2)); // 减法 -100.0
        System.out.println(b1.multiply(b2)); // 乘法 20.04
        System.out.println(b1.remainder(b2)); // 0.2
        System.out.println(b1.max(b2)); // 最大数 100.2
        System.out.println(b1.min(b2)); // 最小数 0.2
        System.out.println(b1.abs()); // 绝对值 0.2
        System.out.println(b1.negate()); // 相反数 -0.2
    }

2、除法常用方法

    

舍入模式(BigDecimal 类 静态字段):

    常用的小学中的四舍五入ROUND_HALF_UP

RoundingMode 其实是个枚举类,点进去源码可以看到其实他就是匹配到几种取舍规则

public enum RoundingMode {

    UP(BigDecimal.ROUND_UP),

    DOWN(BigDecimal.ROUND_DOWN),

    CEILING(BigDecimal.ROUND_CEILING),

    FLOOR(BigDecimal.ROUND_FLOOR),

    HALF_UP(BigDecimal.ROUND_HALF_UP),

    HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),

    HALF_EVEN(BigDecimal.ROUND_HALF_EVEN),

    UNNECESSARY(BigDecimal.ROUND_UNNECESSARY);

    ...
}

测试 demo

    public static void main(String[] args) {
        double d1 = 0.22;
        double d2 = 10.0;
        BigDecimal b1 = BigDecimal.valueOf(d1); // 0.22
        BigDecimal b2 = BigDecimal.valueOf(d2); // 10.0
        /**
         * 精确计算 10 除 0.22 == 45.45454545454545
         */
        /**
         *  ROUND_UP: 总是在非 0 舍弃小数(即截断)之前增加数字(向上取整)。
         *  ROUND_DOWN: 从不在舍弃(即截断)的小数之前增加数字(向下取整)。
         */
        System.out.println("ROUND_UP:" + b2.divide(b1, 3, BigDecimal.ROUND_UP));      // 45.455
        System.out.println("ROUND_DOWN:" + b2.divide(b1, 3, BigDecimal.ROUND_DOWN )); // 45.454

        /**
         *  ROUND_HALF_UP: 若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。(小学中的四舍五入)
         *  ROUND_HALF_DOWN: 若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。
         */
        System.out.println("ROUND_HALF_UP:" + b2.divide(b1, 3, BigDecimal.ROUND_HALF_UP));     // 45.455
        System.out.println("ROUND_HALF_DOWN::" + b2.divide(b1, 3, BigDecimal.ROUND_HALF_DOWN));// 45.455

        /**
         *  ROUND_CEILING: 如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。
         *  ROUND_FLOOR: 如果BigDecimal为正,则表现为ROUND_DOWN ; 如果为负,表现为ROUND_UP 。
         */
        System.out.println("ROUND_CEILING:" + b2.divide(b1, 3, BigDecimal.ROUND_CEILING)); // 45.455
        System.out.println("ROUND_FLOOR:" + b2.divide(b1, 3, BigDecimal.ROUND_FLOOR));     // 45.454

        /**
         *  ROUND_HALF_EVEN: 如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
         *  ROUND_UNNECESSARY: 该“伪舍入模式”实际是指明所要求的操作必须是精确的,因此不需要舍入。 
         *                     如果在产生不精确结果的操作上指定了舍入模式,则抛出ArithmeticException 。
         */
        System.out.println("ROUND_HALF_EVEN:" + b2.divide(b1, 3, BigDecimal.ROUND_HALF_EVEN));   // 45.455
        // System.out.println("ROUND_UNNECESSARY:" + b2.divide(b1, 3, BigDecimal.ROUND_UNNECESSARY)); // 
        /**
         *  RoundingMode 枚举类型一样
         */
        BigDecimal divide = b2.divide(b1, 3, RoundingMode.HALF_UP);
        System.out.println("RoundingMode.HALF_UP:" + divide);      // 加法 45.455
    }

三、BigInteger 类

      BigInteger 类是针对大 整数的处理类,而 BigDecimal 类则是针对大 小数的处理类。一般使用不多,用法同 BigDecimal 类似。这里就不测试啦。

      BigInteger 类使用参考文章:Java中BigInteger类的使用方法详解

      

ends ~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值