BigDecimal中的精度问题

	double a=0.1;  
	      double b=0.2;  
	      System.out.println(a+b);  
	      BigDecimal a1=new BigDecimal("0.1");  
	      BigDecimal b1=new BigDecimal("0.2");  
	      System.out.println(a1.add(b1));  
	      BigDecimal c1=new BigDecimal("0.23574");  
	      a1=a1.add(c1);  
	      a1=a1.setScale(1,BigDecimal.ROUND_DOWN);  
	      System.out.println(a1);  

	}

输出结果为:

0.30000000000000004
0.3
0.3
第一个计算值 我之前已经讲过,浮点数值在java中计算都得不到准确的值,

第二个计算值 是由于简单类型的double转化成了BigDecimal类型的值,之后进行相关运算得到了正确的值

第三个为啥能得到0.3呢? 关键在于a1.setScale(1,BigDecimal.ROUND_Down)

下面对这个方法进行讲解:

BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍


.scale()  取精度值,即小数点后位数(注:BigDecimal可以通过setScale来提高精度,只要新设的值比原来的大!
BigDecimal也可以通过setScale来降低精度。因为新设的值比原来的小,所以必须保证原来数值的该位小数点后面都是0,只有这样才可以设比原来小的精度。

如:原来的值是:4.1235648,想把scale设为小于7为都会出错的,如果原来的值是:4.1235000,把scale设为小于4位会出错,而设为4、5、6、7都没有问题,设得更大,肯定不会出错


目前java支持7中舍入法:

      1、 ROUND_UP:远离零方向舍入。向绝对值最大的方向舍入,只要舍弃位非0即进位。在精度值scale之后的位数只要存在不0的值都向前进一

BigDecimal c1=newBigDecimal("0.23501"); c1=c1.setScale(3,BigDecimal.ROUND_UP);输出0.235 如果0.23500则输出,0.235

      2、 ROUND_DOWN:趋向零方向舍入。向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。在精度值为scale之后的位数不管是否存在或是不管数值为多大 都去掉

     3、 ROUND_CEILING:向正无穷方向舍入。向正最大方向靠拢。若是正数,舍入行为类似于ROUND_UP,若为负数,舍入行为类似于ROUND_DOWN。Math.round()方法就是使用的此模式。

      4、 ROUND_FLOOR:向负无穷方向舍入。向负无穷方向靠拢。若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。

      5、 HALF_UP:最近数字舍入(5进)。这是我们最经典的四舍五入。

      6、 HALF_DOWN:最近数字舍入(5舍)。在这里5是要舍弃的。

      7、 HAIL_EVEN:银行家舍入法。






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值