第一种:Math.round 是对整数取整
public class A{
public static void main(String args[]){
double a = 97.62;
System.out.println(Math.round(a))
}
//输出就是 98 这个无论怎么样都会四舍五入 而且是整数的,只跟第一个小数有关 跟其他小数无关 不做特别推荐
}
第二种: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 D() {
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