BigDecimal精度控制

博客主要介绍Java中BigDecimal的精度控制。阐述了BigDecimal的精度控制规则,如ROUND_UP、ROUND_DOWN等不同规则的含义;还说明了使用BigDecimal除法运算时的精度控制,以及通过其静态方法进行精度控制的相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. BigDecimal中的精度控制规则

ROUND_UP //不管保留数字后面是大是小(0除外)都会进1

ROUND_DOWN //保留设置数字,后面所有直接去除

ROUND_HALF_UP //常用的四舍五入

ROUND_HALF_DOWN //五舍六入

ROUND_CEILING //向正无穷方向舍入

ROUND_FLOOR //向负无穷方向舍入

ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN

2.使用BigDecimal除法运算精度控制

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)  第一参数表示除数,第二个参数表示小数点后保留位数,第三个参数表示取舍规则

@Test
    public void test2() {

        //使用divide做除法精度控制
        BigDecimal a = new BigDecimal("1.333333");
        BigDecimal b = new BigDecimal("1.444444");
        BigDecimal c = new BigDecimal("1.5555555");
        BigDecimal d = new BigDecimal("1.6666666");
        BigDecimal e = new BigDecimal("1");

        //ROUND_UP          //不管保留数字后面是大是小(0除外)都会进1
        double di1 = a.divide(e, 3, BigDecimal.ROUND_UP).doubleValue();// 1.334

        //ROUND_DOWN        //保留设置数字,后面所有直接去除
        double di2 = a.divide(e, 3, BigDecimal.ROUND_DOWN).doubleValue();// 1.333

        //ROUND_HALF_UP     //常用的四舍五入
        double di3 = b.divide(e, 3, BigDecimal.ROUND_HALF_UP).doubleValue();// 1.444
        double di9 = c.divide(e, 3, BigDecimal.ROUND_HALF_UP).doubleValue();// 1.556

        //ROUND_HALF_DOWN   //四舍五入
        double di4 = c.divide(e, 3, BigDecimal.ROUND_HALF_DOWN).doubleValue();// 1.556
        double di10 = d.divide(e, 3, BigDecimal.ROUND_HALF_DOWN).doubleValue();// 1.667

        //ROUND_CEILING     //向正无穷方向舍入
        double di5 = a.divide(e, 3, BigDecimal.ROUND_CEILING).doubleValue();// 1.334

        //ROUND_FLOOR       //向负无穷方向舍入
        double di6 = a.divide(e, 3, BigDecimal.ROUND_FLOOR).doubleValue();// 1.333

        //ROUND_HALF_EVEN   //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
        double di7 = a.divide(e, 3, BigDecimal.ROUND_HALF_EVEN).doubleValue();// 1.333

        System.out.println("di1 = " + di1);
        System.out.println("di2 = " + di2);
        System.out.println("di3 = " + di3);
        System.out.println("di9 = " + di9);
        System.out.println("di4 = " + di4);
        System.out.println("di10 = " + di10);
        System.out.println("di5 = " + di5);
        System.out.println("di6 = " + di6);
        System.out.println("di7 = " + di7);
    }

3.使用BigDecimal静态方法做精度控制

@Test
    public void test3() {

        //使用divide做除法精度控制
        BigDecimal a = new BigDecimal("1.333333");
        BigDecimal b = new BigDecimal("1.444444");
        BigDecimal c = new BigDecimal("1.5555555");
        BigDecimal d = new BigDecimal("1.6666666");

        //ROUND_UP          //不管保留数字后面是大是小(0除外)都会进1
        double di1 = a.setScale(3, BigDecimal.ROUND_UP).doubleValue();//1.334

        //ROUND_DOWN        //保留设置数字,后面所有直接去除
        double di2 = a.setScale(3, BigDecimal.ROUND_DOWN).doubleValue();//1.333

        //ROUND_HALF_UP     //常用的四舍五入
        double di3 = b.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();//1.444
        double di9 = c.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();//1.556

        //ROUND_HALF_DOWN   //四舍五入
        double di4 = c.setScale(3, BigDecimal.ROUND_HALF_DOWN).doubleValue();//1.556
        double di10 = d.setScale(3, BigDecimal.ROUND_HALF_DOWN).doubleValue();//1.667
        double di11 = b.setScale(3, BigDecimal.ROUND_HALF_DOWN).doubleValue();//1.444

        //ROUND_CEILING     //向正无穷方向舍入
        double di5 = a.setScale(3, BigDecimal.ROUND_CEILING).doubleValue();//1.334

        //ROUND_FLOOR       //向负无穷方向舍入
        double di6 = a.setScale(3, BigDecimal.ROUND_FLOOR).doubleValue();//1.333

        //ROUND_HALF_EVEN   //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
        double di7 = a.setScale(3, BigDecimal.ROUND_HALF_EVEN).doubleValue();//1.333

        System.out.println("di1 = " + di1);
        System.out.println("di2 = " + di2);
        System.out.println("di3 = " + di3);
        System.out.println("di9 = " + di9);
        System.out.println("di4 = " + di4);
        System.out.println("di10 = " + di10);
        System.out.println("di11 = " + di11);
        System.out.println("di5 = " + di5);
        System.out.println("di6 = " + di6);
        System.out.println("di7 = " + di7);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值