BigDecimal处理 四舍五入

最近项目中遇到了关于BigDecimal取舍精度的问题,还遇到了一些坑,在此记录一下。

public static void main(String[] args) {

		BigDecimal bd = new BigDecimal("10.5");
		
		int count = bd.scale();
		//结果:1  返回的是小数点后位数
        System.out.println("count:"+count);
		
		String bd1  = bd.setScale( 0, BigDecimal.ROUND_HALF_UP ).toString();
		//结果:11  BigDecimal 转成 String 四舍五入保留整数
		System.out.println("bd1:"+bd1); 
		
		DecimalFormat format2 = new DecimalFormat("0");
		String bd2 = format2.format(bd);
		//结果:10  不设置取数模式 默认银行家舍入法(四舍六入五取偶)
		System.out.println("bd2:"+bd2);
		
		DecimalFormat format1 = new DecimalFormat("0");
		format1.setRoundingMode(RoundingMode.HALF_UP);
		String bd3 = format1.format(bd);
		//结果:11  设置取数模式 四舍五入
		System.out.println("bd3:"+bd3);
		
		BigDecimal bdnum = new BigDecimal("10.556");
		DecimalFormat format3 = new DecimalFormat("0.00");
		format1.setRoundingMode(RoundingMode.HALF_UP);
		String bd4 = format3.format(bdnum);
		//结果:10.56  设置取数模式 四舍五入
		System.out.println("bd4:"+bd4);
		
		String bd5  = bdnum.setScale( 2, BigDecimal.ROUND_HALF_UP ).toString();
		//结果:10.56  BigDecimal 转成 String 四舍五入保留整数
		System.out.println("bd5:"+bd5); 
	
	}

补充一:BigDecimal.setScale用法总结

转自:BigDecimal.setScale用法总结

  1. ROUND_DOWN
    BigDecimal b = new BigDecimal(“2.225667”).setScale(2, BigDecimal.ROUND_DOWN);
    System.out.println(b);//2.22 直接去掉多余的位数
  2. ROUND_UP
    BigDecimal c = new BigDecimal(“2.224667”).setScale(2, BigDecimal.ROUND_UP);
    System.out.println©;//2.23 跟上面相反,进位处理
  3. ROUND_CEILING
    天花板(向上),正数进位向上,负数舍位向上
    BigDecimal f = new BigDecimal(“2.224667”).setScale(2, BigDecimal.ROUND_CEILING);
    System.out.println(f);//2.23 如果是正数,相当于BigDecimal.ROUND_UP
    BigDecimal g = new BigDecimal("-2.225667").setScale(2, BigDecimal.ROUND_CEILING);
    System.out.println(g);//-2.22 如果是负数,相当于BigDecimal.ROUND_DOWN
  4. ROUND_FLOOR
    地板(向下),正数舍位向下,负数进位向下
    BigDecimal h = new BigDecimal(“2.225667”).setScale(2, BigDecimal.ROUND_FLOOR);
    System.out.println(h);//2.22 如果是正数,相当于BigDecimal.ROUND_DOWN
    BigDecimal i = new BigDecimal("-2.224667").setScale(2, BigDecimal.ROUND_FLOOR);
    System.out.println(i);//-2.23 如果是负数,相当于BigDecimal.ROUND_HALF_UP
  5. ROUND_HALF_UP
    BigDecimal d = new BigDecimal(“2.225”).setScale(2, BigDecimal.ROUND_HALF_UP);
    System.out.println(“ROUND_HALF_UP”+d); //2.23 四舍五入(若舍弃部分>=.5,就进位)
  6. ROUND_HALF_DOWN
    BigDecimal e = new BigDecimal(“2.225”).setScale(2, BigDecimal.ROUND_HALF_DOWN);
    System.out.println(“ROUND_HALF_DOWN”+e);//2.22 四舍五入(若舍弃部分>.5,就进位)
  7. ROUND_HALF_EVEN
    具体见百度 银行家舍入法
  8. ROUND_UNNECESSARY
    BigDecimal l = new BigDecimal(“2.215”).setScale(3, BigDecimal.ROUND_UNNECESSARY);
    System.out.println(l);
    //断言请求的操作具有精确的结果,因此不需要舍入。

遇到的坑:Java DecimalFormat四舍五入的坑及正确用法

在处理小数保留几位小数时,想到了DecimalFormat这个类,但是最后在结果验证的时候0.5得到的数据是0,后来发现问题。DecimalFormat 不设置取数模式,默认银行家舍入法(四舍六入五取偶),不是我们所说的普通的四舍五入。设置取数模式后得到所需要的结果。

补充二:java.math.RoundingMode 几个参数详解

转自 java.math.RoundingMode 几个参数详解
RoundingMode.CEILING:取右边最近的整数
RoundingMode.DOWN:去掉小数部分取整,也就是正数取左边,负数取右边,相当于向原点靠近的方向取整
RoundingMode.FLOOR:取左边最近的正数
RoundingMode.HALF_DOWN:五舍六入,负数先取绝对值再五舍六入再负数
RoundingMode.HALF_UP:四舍五入,负数原理同上
RoundingMode.HALF_EVEN:这个比较绕,整数位若是奇数则四舍五入,若是偶数则五舍六入
ps:与上一个补充可以对应看

你可能感兴趣的:(后端,java)