Java四舍五入等详解

一、Math.round()

  • long round(double d)
  • int round(float f)

Math.round()是Java中经典的舍入数字方法,它返回的是整数,也就是说对浮点数四舍五入成整数。

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

  • 远离零方向舍入,向绝对值最大的方向舍入,只要舍弃位非O即进位。
//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+"\t2.163=>"+bigDecimal4);//2.123=>2.2,2.163=>2.2

round.down

  • 趋向零方向舍入,向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。
//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+"\t2.163=>"+bigDecimal6);//2.123=>2.1,2.163=>2.1

round.ceiling

  • 向正无穷方向舍入,向正最大方向靠拢。
//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.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(经典四舍五入)

//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(五舍六入)

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