最近项目中遇到了关于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用法总结
- ROUND_DOWN
BigDecimal b = new BigDecimal(“2.225667”).setScale(2, BigDecimal.ROUND_DOWN);
System.out.println(b);//2.22 直接去掉多余的位数- ROUND_UP
BigDecimal c = new BigDecimal(“2.224667”).setScale(2, BigDecimal.ROUND_UP);
System.out.println©;//2.23 跟上面相反,进位处理- 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- 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- 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,就进位)- 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,就进位)- ROUND_HALF_EVEN
具体见百度 银行家舍入法- 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:与上一个补充可以对应看
最后
以上就是端庄月光最近收集整理的关于BigDecimal处理 四舍五入的全部内容,更多相关BigDecimal处理内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复