Java四舍五入的3种常见方法(取整及保留小数)

Java四舍五入的3种常见方法(取整及保留小数)-mikechen

四舍五入在Java程序员开发中经常碰见,今天给大家分享Java四舍五入的3种常见方法。

第一种:Math.round

Math.round()是Java中舍入数字的经典方法,Math.round(变量名称)这种返回的其实是整数,也就是说对整数进行四舍五入。

该方法有以下几种语法格式:

long round(double d)

int round(float f)

具体示例如下:

public class Test{
    public static void main(String args[]){
        double d = 100.675;
        double e = 100.500;
        float f = 100;
        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)); 
    }
}

输出结果为:

101
101
100
90

 

第二种:BigDecimal

Java的最佳实践是优先使用BigDecimal而不是Math.round()来对Java中的数字进行四舍五入。

每当我需要将数字四舍五入到小数点后n位时,我首先想到的是BigDecimal。

BigDecimal中有8中四舍五入设置方式:

(1).ROUND_UP:远离零方向舍入,向绝对值最大的方向舍入,只要舍弃位非0即进位。

(2).ROUND_DOWN:趋向零方向舍入,向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。

(3).ROUND_CEILING:向正无穷方向舍入,向正最大方向靠拢。若是正数,舍入行为类似于ROUND_UP,若为负数,舍入行为类似于ROUND_DOWN。Math.round()方法就是使用的此模式。

(4).ROUND_FLOOR:向负无穷方向舍入,向负无穷方向靠拢。若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。

(5).ROUND_HALF_UP:最近数字舍入(5进),这是我们最经典的四舍五入。

(6).ROUND_HALF_DOWN:最近数字舍入(5舍),在这里5是要舍弃的。

(7).ROUND_HALF_EVEN:银行家舍入法。

(8).ROUND_UNNECESSARY:计算结果是精确的,不需要舍入模式。

具体示例如下:

public static void round_half_up() {
       System.out.println("四舍五入(保留位后一位是5进位) = " + new BigDecimal("2.35").setScale(1, BigDecimal.ROUND_HALF_UP)); //常用
       System.out.println("四舍五入(保留位后一位是5舍弃) = " + new BigDecimal("2.35").setScale(1, BigDecimal.ROUND_HALF_DOWN));
       System.out.println("四舍五入(保留位是奇数) = " + new BigDecimal("4.55").setScale(1, BigDecimal.ROUND_HALF_EVEN)); //向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
       System.out.println("四舍五入(保留位是偶数) = " + new BigDecimal("4.45").setScale(1, BigDecimal.ROUND_HALF_EVEN)); //向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
       System.out.println("            进位    = " + new BigDecimal("2.31").setScale(1, BigDecimal.ROUND_UP));
   }

输出为:

四舍五入(保留位后一位是5进位) = 2.4
四舍五入(保留位后一位是5舍弃) = 2.3
四舍五入(保留位是奇数) = 4.6
四舍五入(保留位是偶数) = 4.4
            进位    = 2.4

 

第三种:DecimalFormat

DecimalFormat默认采用了RoundingMode.HALF_EVEN这种类型,而且format之后的结果是一个字符串类型String。

DecimalFormat 包含一组符号,对于各符号的含义解释如下:

0 一个数字

# 一个数字,不包括 0

. 小数的分隔符的占位符

, 分组分隔符的占位符

; 分隔格式。

- 缺省负数前缀。

% 乘以 100 和作为百分比显示

? 乘以 1000 和作为千进制货币符显示;用货币符号代替;如果双写,用国际货币符号代替。如果出现在一个模式中,用货币十进制分隔符代 替十进制分隔符。

具体示例如下:

DecimalFormat df = new DecimalFormat("#.000");

System.out.println(df.format(new BigDecimal(1.0145)));
System.out.println(df.format(new BigDecimal(1.1315)));

输出为:

1.014
1.131

 

Java四舍五入总结

我们可以使用Math.round(),BigDecimal、DecimalFormat将Java中的任何浮点数四舍五入到n个位置。

Java的最佳实践是优先使用BigDecimal,因为它具有便捷的API并支持多种舍入模式,而且在金融行业工作,最好使用BigDecimal进行货币计算。

 

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法