/** * 保留两位小数(截断) * @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); }
HALFEVEN:DecimalFormat 默认的 RoundingMode 为 RoundingMode.HALFEVEN,也称为“银行家舍入法”,主要在美国使用。四舍六入,五分向相邻的偶数舍入。以下例子为保留小数点1位,那么这种舍入方式下的结果。1.15--->1.2;1.25--->1.2。
HALF_UP:四舍五入。
HALF_DOWN:五舍六入。示例:2.5--->2;2.6--->3。
DOWN:直接截断。
UP:始终对非零舍弃部分前面的数字加 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
整数部分比实际数字的位数少,整数部分不改动。
小数部分比实际数字的位数少,根据小数部分占位符数量保留小数。
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
比实际数字的位数多,不变。
new DecimalFormat("##.##").format(3.14) //结果:3.14
new DecimalFormat("#.###").format(3.14) //结果: 3.14
new DecimalFormat("##.###").format(3.14) //结果:3.14
整数部分比实际数字的位数少,整数部分不改动。
小数部分比实际数字的位数少,根据小数部分占位符数量保留小数。
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; }