/**
* 保留两位小数(截断)
* @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;
}