BigDecimal详情使用和注意事项(超全)

一、构造函数

下面介绍几种常用的BigDecimal的构造函数示例和注意事项,代码如下:

    /**
     * BigDecimal 构造函数
     *
     * @param args
     */
    public static void main(String[] args) {

        // 1.int:创建一个具体参数所指定 整数值的 BigDecimal 对象
        BigDecimal intBigDecimal= new BigDecimal(2);
        System.out.println("intBigDecimal = " + intBigDecimal);

        // 2.String:创建一个具有参数所指定以 字符串 表示的BigDecimal对象
        BigDecimal stringBigDecimal = new BigDecimal("2");
        System.out.println("stringBigDecimal = " + stringBigDecimal);

        // 3.long:创建一个具有参数所指定的 长整数的 BgiDecimal对象
        BigDecimal longBigDecimal = new BigDecimal(2L);
        System.out.println("longBigDecimal = " + longBigDecimal);

        // 4.double:创建一个具有参数所指定 双精度值的 BigDecimal 对象
        BigDecimal doubleBigDecimal = new BigDecimal(0.2);
        System.out.println("doubleBigDecimal = " + doubleBigDecimal);
        
    }

结果

 现象

常用的BIgDecimal构造函数中,当传入double类型的作为入参,其结果是有误的

 原因

参数类型为double的构造方法的结果具有一定的不可预知性。就像上面的程序表示的那样,虽然new BigDecimal(0.2)所创建的Bigdecimal是0.2,但是实际上得到的值确是不同的,因为0.2无法准确地表示为double,所以传入构造方法的值也就出现了误差。

 建议

当使用double类型创建BigDecimal对象给的时候,可能会出现精度误差,不建议使用,如果非要使用double类型的作为入参,建议先转换为String,如下所示

   /**
     * BigDecimal 构造函数
     *
     * @param args
     */
    public static void main(String[] args) {

        // 1.int:创建一个具体参数所指定 整数值的 BigDecimal 对象
        BigDecimal intBigDecimal= new BigDecimal(2);
        System.out.println("intBigDecimal = " + intBigDecimal);

        // 2.String:创建一个具有参数所指定以 字符串 表示的BigDecimal对象
        BigDecimal stringBigDecimal = new BigDecimal("2");
        System.out.println("stringBigDecimal = " + stringBigDecimal);

        // 3.long:创建一个具有参数所指定的 长整数的 BgiDecimal对象
        BigDecimal longBigDecimal = new BigDecimal(2L);
        System.out.println("longBigDecimal = " + longBigDecimal);

        // 4.double:创建一个具有参数所指定 双精度值的 BigDecimal 对象
        BigDecimal doubleBigDecimal = new BigDecimal(0.2);
        System.out.println("doubleBigDecimal = " + doubleBigDecimal);

        // 5、double:先转为String,再创建BigDecimal对象
        BigDecimal doubleToStringBigDecimal = new BigDecimal(String.valueOf(0.2));
        System.out.println("doubleToStringBigDecimal = " + doubleToStringBigDecimal);

    }

二、加减乘除

 /**
     * BigDecimal 加减乘除
     *
     * @param args
     */
    public static void main(String[] args) {

        // 定义两个变量 num1 = 1,num2 = 10
        BigDecimal num1 = new BigDecimal("2");
        BigDecimal num2 = new BigDecimal("10");

        // 相加
        BigDecimal add = num1.add(num2);
        System.out.println("相加后的结果 = " + add);

        // 想减
        BigDecimal subtract = num1.subtract(num2);
        System.out.println("相减后的结果 = " + subtract);

        // 相乘
        BigDecimal multiply = num1.multiply(num2);
        System.out.println("相乘后的结果 = " + multiply);

        // 相除
        BigDecimal divide = num1.divide(num2);
        System.out.println("相除后的结果 = " + divide);

    }

三、比较大小

两个BigDecimal引用对象比较后再与0相比较

 /**
     * BigDecimal 比较大小
     *
     * @param args
     */
    public static void main(String[] args) {

        // 定义两个变量 num1 = 1,num2 = 10
        BigDecimal num1 = new BigDecimal("2");
        BigDecimal num2 = new BigDecimal("10");

        /**
         * 比较好的结果
         * i > 0 则 num1 > num2
         * i = 0 则 num1 = num2
         * i < 0 则 num1 < num2
         */
        int i = num1.compareTo(num2);
        System.out.println("请问num1比num2大是正确的吗:" + (i > 0 ? "正确" : "错误"));
    }

四、精度问题

RoundingMode.DOWN

  /**
     * BigDecimal 进度问题
     *
     * @param args
     */
    public static void main(String[] args) {

        // 定义原来的一个数字 num = 3.14159
        BigDecimal num = new BigDecimal("3.14159");
        System.out.println("原来的数字为 = " + num);

        // 1.RoundingMode.DOWN  保留3位小数,直接删除多余的小数位,结果位3.141
        BigDecimal bigDecimal = num.setScale(3, RoundingMode.DOWN);
        System.out.println("bigDecimal = " + bigDecimal);

    }

RoundingMode.UP

  /**
     * BigDecimal 进度问题
     *
     * @param args
     */
    public static void main(String[] args) {

        // 定义原来的一个数字 num = 3.14159
        BigDecimal num = new BigDecimal("3.14159");
        System.out.println("原来的数字为 = " + num);

        // RoundingMode.UP  保留3位小数,进位处理,四舍五入,结果位3.142
        BigDecimal bigDecimal = num.setScale(3, RoundingMode.UP);
        System.out.println("bigDecimal = " + bigDecimal);

    }

RoundingMode.HALF_UP

 /**
     * BigDecimal 进度问题
     *
     * @param args
     */
    public static void main(String[] args) {

        // 定义原来的一个数字 num = 3.14159
        BigDecimal num = new BigDecimal("3.14159");
        System.out.println("原来的数字为 = " + num);

        // RoundingMode.HALF_UP  保留3位小数,四舍五入,结果位3.142
        BigDecimal bigDecimal = num.setScale(3, RoundingMode.HALF_UP);
        System.out.println("bigDecimal = " + bigDecimal);

    }

 RoundingMode.HALF_DOWN  

  /**
     * BigDecimal 进度问题
     *
     * @param args
     */
    public static void main(String[] args) {

        // 定义原来的一个数字 num = 2.35
        BigDecimal num = new BigDecimal("2.35");
        System.out.println("原来的数字为 = " + num);

        // RoundingMode.HALF_DOWN  保留1位小数,如果是5则向下舍,结果位2.3
        BigDecimal bigDecimal = num.setScale(1, RoundingMode.HALF_DOWN);
        System.out.println("bigDecimal = " + bigDecimal);

        // RoundingMode.HALF_DOWN  保留1位小数,如果超过5则向上入,结果位2.4
        BigDecimal num1 = new BigDecimal("2.36");
        BigDecimal bigDecimal1 = num1.setScale(1, RoundingMode.HALF_DOWN);
        System.out.println("bigDecimal1 = " + bigDecimal1);
    }

五、总结

希望能帮助到大家,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值