• Java四舍五入


    一、Math.round()

    ​ Math.round(变量名称)这种返回的其实是整数,也就是说对整数进行四舍五入。

    public class Main(){
        public static void main(){
            double d = 100.34;
            double e = 100.500;
            float f = 144;
            float g = 90f;
            
            System.out.println(Math.round(d));
            System.out.println(Math.round(e));
            System.out.println(Math.round(f));
            System.out.println(Math.round(g));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果

    100
    101
    144
    90
    
    • 1
    • 2
    • 3
    • 4

    二、BigDecimal

    Java的最佳实践是优先使用BigDecimal而不是Math.round()来对Java的数字进行四舍五入。每当需要将数字四舍五入到小数点后n位时,首先考虑BigDecimal。

    round.up

    远离零方向舍入,向绝对值最大的方向舍入,只要舍弃位非0即进位。

    //round.up
    BigDecimal bigDecimal3 = new BigDecimal("2.123").setScale(1, BigDecimal.ROUND_UP);
    BigDecimal bigDecimal4 = new BigDecimal("2.163").setScale(1, BigDecimal.ROUND_UP);
    System.out.println("2.123=>"+bigDecimal3);//2.123=>2.2
    System.out.println("2.163=>"+bigDecimal4);//2.163=>2.2
    
    • 1
    • 2
    • 3
    • 4
    • 5

    round.down

    趋向0方向舍入,向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。

    //round.down
    BigDecimal bigDecimal5 = new BigDecimal("2.123").setScale(1, BigDecimal.ROUND_DOWN);
    BigDecimal bigDecimal6 = new BigDecimal("2.163").setScale(1, BigDecimal.ROUND_DOWN);
    System.out.println("2.123=>"+bigDecimal5);//2.123=>2.1
    System.out.println("2.163=>"+bigDecimal6);//2.163=>2.1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    round.ceiling

    向正无穷方向舍入,向正最大方向靠拢。
    若是正数,舍入行为类似于ROUND_UP,若为负数,舍入行为类似于ROUND_DOWN。Math.round()方法就是使用的此模式。

    //round.ceiling
    BigDecimal bigDecimal7 = new BigDecimal("2.12").setScale(1, BigDecimal.ROUND_CEILING);
    BigDecimal bigDecimal8 = new BigDecimal("2.19").setScale(1, BigDecimal.ROUND_CEILING);
    BigDecimal bigDecimal9 = new BigDecimal("-2.12").setScale(1, BigDecimal.ROUND_CEILING);
    BigDecimal bigDecimal10 = new BigDecimal("-2.19").setScale(1, BigDecimal.ROUND_CEILING);
    System.out.println("2.12=>"+bigDecimal7+"\t2.19=>"+bigDecimal8+"\t-2.12=>"+bigDecimal9+"\t-2.19=>"+bigDecimal10);
    //2.12=>2.2	2.19=>2.2	-2.12=>-2.1	-2.19=>-2.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    round.floor

    向负无穷方向舍入,向负无穷方向靠拢。
    若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。

    //round.floor
    BigDecimal bigDecimal11 = new BigDecimal("2.12").setScale(1, BigDecimal.ROUND_FLOOR);
    BigDecimal bigDecimal12 = new BigDecimal("2.19").setScale(1, BigDecimal.ROUND_FLOOR);
    BigDecimal bigDecimal13 = new BigDecimal("-2.12").setScale(1, BigDecimal.ROUND_FLOOR);
    BigDecimal bigDecimal14 = new BigDecimal("-2.19").setScale(1, BigDecimal.ROUND_FLOOR);
    System.out.println("2.12=>"+bigDecimal11+"\t2.19=>"+bigDecimal12+"\t-2.12=>"+bigDecimal13+"\t-2.19=>"+bigDecimal14);
    //2.12=>2.1	2.19=>2.1	-2.12=>-2.2	-2.19=>-2.2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    round.half_up(经典四舍五入)

    最近数字舍入(5进),这是我们最经典的四舍五入。

    //round.half_up(经典四舍五入)
    BigDecimal bigDecimal15 = new BigDecimal("2.12").setScale(1, BigDecimal.ROUND_HALF_UP);
    BigDecimal bigDecimal16 = new BigDecimal("2.19").setScale(1, BigDecimal.ROUND_HALF_UP);
    BigDecimal bigDecimal17 = new BigDecimal("-2.12").setScale(1, BigDecimal.ROUND_HALF_UP);
    BigDecimal bigDecimal18 = new BigDecimal("-2.19").setScale(1, BigDecimal.ROUND_HALF_UP);
    System.out.println("2.12=>"+bigDecimal15+"\t2.19=>"+bigDecimal16+"\t-2.12=>"+bigDecimal17+"\t-2.19=>"+bigDecimal18);
    //2.12=>2.1	2.19=>2.2	-2.12=>-2.1	-2.19=>-2.2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    round.half_down(五舍六入)

    最近数字舍入(5舍),在这里5是要舍弃的。

    //round.half_down(五舍六入)
    BigDecimal bigDecimal19 = new BigDecimal("2.15").setScale(1, BigDecimal.ROUND_HALF_DOWN);
    BigDecimal bigDecimal20 = new BigDecimal("2.16").setScale(1, BigDecimal.ROUND_HALF_DOWN);
    BigDecimal bigDecimal21 = new BigDecimal("-2.15").setScale(1, BigDecimal.ROUND_HALF_DOWN);
    BigDecimal bigDecimal22 = new BigDecimal("-2.16").setScale(1, BigDecimal.ROUND_HALF_DOWN);
    System.out.println("2.15=>"+bigDecimal19+"\t2.16=>"+bigDecimal20+"\t-2.15=>"+bigDecimal21+"\t-2.16=>"+bigDecimal22);
    //2.15=>2.1	2.16=>2.2	-2.15=>-2.1	-2.16=>-2.2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    round.unnecessary

    计算结果是精确的,不需要舍入模式。

    //round.unnecessary
    BigDecimal bigDecimal23 = new BigDecimal("2.1544").setScale( BigDecimal.ROUND_UNNECESSARY);
    BigDecimal bigDecimal24 = new BigDecimal("2.1544444").setScale( BigDecimal.ROUND_UNNECESSARY);//只能精确到7位
    System.out.println("2.1544=>"+bigDecimal23+"\t2.15444444=>"+bigDecimal24);
    
    • 1
    • 2
    • 3
    • 4

    ROUND_HALF_EVEN:银行家舍入法

    向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

    BigDecimal bigDecimal1 = new BigDecimal("4.55").setScale( BigDecimal.ROUND_HALF_EVEN);
    BigDecimal bigDecimal2 = new BigDecimal("4.45").setScale( BigDecimal.ROUND_HALF_EVEN);
    //四舍五入(保留位是奇数) = 4.6
    //四舍五入(保留位是偶数) = 4.4
    
    • 1
    • 2
    • 3
    • 4

    第三种:DecimalFormat

    DecimalFormat默认采用了RoundingMode.HALF_EVEN这种类型,而且format之后的结果是一个字符串类型String。
    DecimalFormat 包含一组符号,对于各符号的含义解释如下:

    0	一个数字
    #	一个数字,不包括 0
    .	小数的分隔符的占位符
    ,	分组分隔符的占位符
    ;	分隔格式。
    -   缺省负数前缀。
    %	乘以 100 和作为百分比显示
    ?	乘以 1000 和作为千进制货币符显示;用货币符号代替;如果双写,用国际货币符号代替。如果出现在一个模式中,用货币十进制分隔符代替十进制分隔符。;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    具体示例如下:

    DecimalFormat  df = DecimalFormat("#.000");
    System.out.println(df.format(new BigDecimal(1.0145)));//1.014
    System.out.println(df.format(new BigDecimal(1.1315)));//1.131
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Prometheus完整安装
    锐捷RG-UAC统一上网行为管理审计系统信息泄漏漏洞
    zipkin2.24.2源码install遇见的问题
    windows 上 python open函数打开文件夹报错提示权限不足
    0号进程,1号进程,2号进程
    ESP32+阿里云+vscode_Pio
    【深入理解Linux内核锁】七、互斥体
    Node.JS是什么
    二维码智慧门牌管理系统升级解决方案:实现服务状态实时监控
    PWN --- ret2shellcode
  • 原文地址:https://blog.csdn.net/strggle_bin/article/details/134525033