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));
}
}
结果
100
101
144
90
Java的最佳实践是优先使用BigDecimal而不是Math.round()来对Java的数字进行四舍五入。每当需要将数字四舍五入到小数点后n位时,首先考虑BigDecimal。
远离零方向舍入,向绝对值最大的方向舍入,只要舍弃位非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
趋向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
向正无穷方向舍入,向正最大方向靠拢。
若是正数,舍入行为类似于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
向负无穷方向舍入,向负无穷方向靠拢。
若是正数,舍入行为类似于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
最近数字舍入(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
最近数字舍入(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
计算结果是精确的,不需要舍入模式。
//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);
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
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
DecimalFormat默认采用了RoundingMode.HALF_EVEN这种类型,而且format之后的结果是一个字符串类型String。
DecimalFormat 包含一组符号,对于各符号的含义解释如下:
0 一个数字
# 一个数字,不包括 0
. 小数的分隔符的占位符
, 分组分隔符的占位符
; 分隔格式。
- 缺省负数前缀。
% 乘以 100 和作为百分比显示
? 乘以 1000 和作为千进制货币符显示;用货币符号代替;如果双写,用国际货币符号代替。如果出现在一个模式中,用货币十进制分隔符代替十进制分隔符。;
具体示例如下:
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