【Java】BigDecimal.setScale用法总结

本文详细介绍了BigDecimal对象的setScale方法如何进行进位、舍位和精度保持,并列举了不同Rounding Modes在实际应用中的效果。重点讨论了避免精度损失的最佳实践和使用字符串构造方式的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

BigDecimal.setScale主要用于对BigDecimal数据小数点后的位数进行 进位、舍位、截断等操作

 

BigDecimal使用说明

  1. 不建议,会造成精度损失

BigDecimal num1 = new BigDecimal(2.222222);

   2. 不建议,虽然不会损失精度

BigDecimal num2 = new BigDecimal(2);

   3. 建议,使用字符串格式构造,不会损失精度

 BigDecimal num = new BigDecimal("2.222222");

 

BigDecimal Rounding Modes

1. ROUND_UP = 0

BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_UP); 

System.out.println(b); //2.23 进位处理,不管后面数字的大小

2. ROUND_DOWN = 1

BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_DOWN); 

System.out.println(b); //2.22 去掉多余的位数,不管后面数字的大小

3. ROUND_CEILING = 2

BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_CEILING); 

System.out.println(b);//2.23 如果是正数,相当于BigDecimal.ROUND_UP 

BigDecimal b = new BigDecimal("-2.222222").setScale(2, BigDecimal.ROUND_CEILING); 

System.out.println(b);//-2.22 如果是负数,相当于BigDecimal.ROUND_DOWN

4. ROUND_FLOOR = 3

BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_FLOOR); 

System.out.println(b);//2.22 如果是正数,相当于BigDecimal.ROUND_DOWN 


BigDecimal b = new BigDecimal("-2.222222").setScale(2, BigDecimal.ROUND_FLOOR); 

System.out.println(b);//-2.23 如果是负数,相当于BigDecimal.ROUND_HALF_UP

5. ROUND_HALF_UP = 4

BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_HALF_UP); 

System.out.println("ROUND_HALF_UP" + b); //2.22 根据后面的数字四舍五入(大于等于 5进位)

6. ROUND_HALF_DOWN = 5

BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_HALF_DOWN); 

System.out.println("ROUND_HALF_DOWN" + b);//2.22 根据后面的数字四舍五入(大于 5进位)

7. ROUND_HALF_EVEN = 6

BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_HALF_EVEN); 

System.out.println(b);//2.22 如果舍弃部分左边的数字为偶数,则作 ROUND_HALF_DOWN 

BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_HALF_EVEN); 

System.out.println(b);//2.22 如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP

8. ROUND_UNNECESSARY = 7

BigDecimal b = new BigDecimal("2.22").setScale(3, BigDecimal.ROUND_UNNECESSARY); 

System.out.println(b); // Scale位数 必须小于等于 小数位数,否则会抛异常:

java.lang.ArithmeticException: Rounding necessary

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值