DecimalFormat 格式化十进制数字

Java常用方法   2025-01-12 10:26   150   0  

一、保留两位小数(截断)

/**
 * 保留两位小数(截断)
 * @param num 待格式化数字
 * @return 格式化后的数字
 */
public static double KeepTwoDecimalPlacesTruncation(double num) {
    DecimalFormat df = new DecimalFormat("#.##");
    //指定RoundingMode
    df.setRoundingMode(RoundingMode.DOWN);
    String str = df.format(num);
    return Double.parseDouble(str);
}

二、保留两位小数(四舍五入)

/**
 * 保留两位小数(四舍五入)
 * @param num 待格式化数字
 * @return 格式化后的数字
 */
public static double KeepTwoDecimalPlacesRrounded(double num) {
    DecimalFormat df = new DecimalFormat("#.##");
    //指定RoundingMode
    df.setRoundingMode(RoundingMode.HALF_UP);
    String str = df.format(num);
    return Double.parseDouble(str);
}

三、常用 RoundingMode

  1. HALFEVEN:DecimalFormat 默认的 RoundingMode 为 RoundingMode.HALFEVEN,也称为“银行家舍入法”,主要在美国使用。四舍六入,五分向相邻的偶数舍入。以下例子为保留小数点1位,那么这种舍入方式下的结果。1.15--->1.2;1.25--->1.2。

  2. HALF_UP:四舍五入。

  3. HALF_DOWN:五舍六入。示例:2.5--->2;2.6--->3。

  4. DOWN:直接截断。

  5. UP:始终对非零舍弃部分前面的数字加 1。

四、占位符

1、0 表示数字占位符,实际位数不够时补零

  1. 比实际数字的位数多,不足的地方用 0 补上。

new DecimalFormat(“00.00”).format(3.14) //结果:03.14
new DecimalFormat(“0.000”).format(3.14) //结果: 3.140
new DecimalFormat(“00.000”).format(3.14) //结果:03.140

  1. 整数部分比实际数字的位数少,整数部分不改动。

  2. 小数部分比实际数字的位数少,根据小数部分占位符数量保留小数。

new DecimalFormat(“0.000”).format(13.146) //结果:13.146
new DecimalFormat(“00.00”).format(13.146) //结果:13.15
new DecimalFormat(“0.00”).format(13.146) //结果:13.15

2、# 表示数字占位符,实际位数不够时不补零

  1. 比实际数字的位数多,不变。

new DecimalFormat("##.##").format(3.14) //结果:3.14
new DecimalFormat("#.###").format(3.14) //结果: 3.14
new DecimalFormat("##.###").format(3.14) //结果:3.14

  1. 整数部分比实际数字的位数少,整数部分不改动。

  2. 小数部分比实际数字的位数少,根据小数部分占位符数量保留小数。

new DecimalFormat("#.###").format(13.146) //结果:13.146
new DecimalFormat("##.##").format(13.146) //结果:13.15
new DecimalFormat("#.##").format(13.146) //结果:13.15

五、注意:线程不安全

不要把 DecimalFormat 作为一个共享变量使用。每次使用时都 new 一个 DecimalFormat 也可以解决这个问题,但频繁创建销毁对象效能不高,方法上加锁又会降低并发度。因为每个线程自己执行肯定是按顺序执行,所以可以利用 ThreadLocal。可以使 DecimalFormat 变成线程安全的,通过 ThreadLocal 的方式来解决:

/**
 * 线程安全的 DecimalFormat
 */
private static ThreadLocal<DecimalFormat> threadLocalDecimalFormat = new ThreadLocal<DecimalFormat>();

/**
 * 获取 DecimalFormat
 * 
 * @param pattern 格式化
 * @return DecimalFormat
 */
public static DecimalFormat getDecimalFormat(String pattern) {
    DecimalFormat df = threadLocalDecimalFormat.get();
    if (df == null) {
        df = new DecimalFormat(pattern);
        threadLocalDecimalFormat.set(df);
    }
    return df;
}


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。