四舍五入在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睿哥
mikechen睿哥,十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》