基于BigDecimal.setScale的用法小结
1.BigDecimalnum1=newBigDecimal(2.225667);//这种写法不允许,会造成精度损失
2.BigDecimalnum2=newBigDecimal(2);//这种写法是可以的
3.BigDecimalnum=newBigDecimal("2.225667");//一般都会这样写最好
4.intcount=num.scale();
System.out.println(count);//6返回的是小数点后位数
好了,下面开始正式介绍知识点啦~~~~~~
1.ROUND_DOWN
BigDecimalb=newBigDecimal("2.225667").setScale(2,BigDecimal.ROUND_DOWN);
System.out.println(b);//2.22直接去掉多余的位数
2.ROUND_UP
BigDecimalc=newBigDecimal("2.224667").setScale(2,BigDecimal.ROUND_UP);
System.out.println(c);//2.23跟上面相反,进位处理
3.ROUND_CEILING
天花板(向上),正数进位向上,负数舍位向上
BigDecimalf=newBigDecimal("2.224667").setScale(2,BigDecimal.ROUND_CEILING); System.out.println(f);//2.23如果是正数,相当于BigDecimal.ROUND_UP BigDecimalg=newBigDecimal("-2.225667").setScale(2,BigDecimal.ROUND_CEILING); System.out.println(g);//-2.22如果是负数,相当于BigDecimal.ROUND_DOWN
4.ROUND_FLOOR
地板(向下),正数舍位向下,负数进位向下
BigDecimalh=newBigDecimal("2.225667").setScale(2,BigDecimal.ROUND_FLOOR); System.out.println(h);//2.22如果是正数,相当于BigDecimal.ROUND_DOWN BigDecimali=newBigDecimal("-2.224667").setScale(2,BigDecimal.ROUND_FLOOR); System.out.println(i);//-2.23如果是负数,相当于BigDecimal.ROUND_HALF_UP
5.ROUND_HALF_UP
BigDecimald=newBigDecimal("2.225").setScale(2,BigDecimal.ROUND_HALF_UP);
System.out.println("ROUND_HALF_UP"+d);//2.23四舍五入(若舍弃部分>=.5,就进位)
6.ROUND_HALF_DOWN
BigDecimale=newBigDecimal("2.225").setScale(2,BigDecimal.ROUND_HALF_DOWN);
System.out.println("ROUND_HALF_DOWN"+e);//2.22四舍五入(若舍弃部分>.5,就进位)
7.ROUND_HALF_EVEN
BigDecimalj=newBigDecimal("2.225").setScale(2,BigDecimal.ROUND_HALF_EVEN); System.out.println(j);//2.22如果舍弃部分左边的数字为偶数,则作ROUND_HALF_DOWN BigDecimalk=newBigDecimal("2.215").setScale(2,BigDecimal.ROUND_HALF_EVEN); System.out.println(k);//2.22如果舍弃部分左边的数字为奇数,则作ROUND_HALF_UP System.out.println("************************************"); System.out.println("4.05:"+newBigDecimal("4.05").setScale(1,BigDecimal.ROUND_HALF_EVEN));//4.05:4.0down System.out.println("4.15:"+newBigDecimal("4.15").setScale(1,BigDecimal.ROUND_HALF_EVEN));//4.15:4.2up System.out.println("4.25:"+newBigDecimal("4.25").setScale(1,BigDecimal.ROUND_HALF_EVEN));//4.25:4.2down System.out.println("4.35:"+newBigDecimal("4.35").setScale(1,BigDecimal.ROUND_HALF_EVEN));//4.35:4.4up System.out.println("4.45:"+newBigDecimal("4.45").setScale(1,BigDecimal.ROUND_HALF_EVEN));//4.45:4.4down System.out.println("4.55:"+newBigDecimal("4.55").setScale(1,BigDecimal.ROUND_HALF_EVEN));//4.55:4.6up System.out.println("4.65:"+newBigDecimal("4.65").setScale(1,BigDecimal.ROUND_HALF_EVEN));//4.65:4.6down System.out.println("3.05:"+newBigDecimal("3.05").setScale(1,BigDecimal.ROUND_HALF_EVEN));//3.05:3.0down System.out.println("3.15:"+newBigDecimal("3.15").setScale(1,BigDecimal.ROUND_HALF_EVEN));//3.15:3.2up System.out.println("3.25:"+newBigDecimal("3.25").setScale(1,BigDecimal.ROUND_HALF_EVEN));//3.25:3.2down System.out.println("3.35:"+newBigDecimal("3.35").setScale(1,BigDecimal.ROUND_HALF_EVEN));//3.35:3.4up System.out.println("3.45:"+newBigDecimal("3.45").setScale(1,BigDecimal.ROUND_HALF_EVEN));//3.45:3.4down System.out.println("3.55:"+newBigDecimal("3.55").setScale(1,BigDecimal.ROUND_HALF_EVEN));//3.55:3.6up System.out.println("3.65:"+newBigDecimal("3.65").setScale(1,BigDecimal.ROUND_HALF_EVEN));//3.65:3.6down
8.ROUND_UNNECESSARY
BigDecimall=newBigDecimal("2.215").setScale(3,BigDecimal.ROUND_UNNECESSARY); System.out.println(l); //断言请求的操作具有精确的结果,因此不需要舍入。 //如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
补充知识:BigDecimal中divide方法注意问题
BigDecimal中divide方法抛异常:
Non-terminatingdecimalexpansion;noexactrepresentabledecimalresult
在使用
BigDecimalrate=newBigDecimal(1).divide(newBigDecimal(3));
时抛异常:
Non-terminatingdecimalexpansion;noexactrepresentabledecimalresult
原来是在做除法的时候出现了无限不循环小数如:0.333333333333
解决方案
在做做除法的时候指定保留的小数的位数:
BigDecimalrate=newBigDecimal(1).divide(newBigDecimal(3),6,BigDecimal.ROUND_HALF_UP);
以上这篇基于BigDecimal.setScale的用法小结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。