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:与上一个补充可以对应看

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于BigDecimal四舍五入操作,可以使用divide方法中的roundingMode参数来指定。其中,roundingMode表示四舍五入的模式,有几种可选的模式可以使用。 一种常用的模式是BigDecimal.ROUND_HALF_UP(四舍五入)。在这种模式下,当小数点后第三位数大于或等于5时,就进位。例如,如果有一个BigDecimal对象b的值为3.335,可以使用b.setScale(2, BigDecimal.ROUND_HALF_UP)来进行四舍五入操作,结果将为3.34。 另一种模式是BigDecimal.ROUND_HALF_EVEN(银行家舍入法)。在这种模式下,小数点后第三位数的左边一位数(第二位数)为奇数时进位,为偶数时不进位。例如,如果有一个BigDecimal对象b的值为3.365,可以使用b.setScale(2, BigDecimal.ROUND_HALF_EVEN)进行四舍五入操作,结果将为3.36。 在实际使用中,根据具体的需求可以选择合适的四舍五入模式进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [关于BigDecimal数据的四舍五入](https://blog.csdn.net/heweimingming/article/details/49820237)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [BigDecimal 四舍五入处理](https://blog.csdn.net/qq_35598594/article/details/107430643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值