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));
    }
}

结果

100
101
144
90

二、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

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

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

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

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

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

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);

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

第三种:DecimalFormat

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

你可能感兴趣的:(Java,java,开发语言)