金融项目java开发_BigDecimal(解决计算精度问题)

当使用double进行商业运算时,double计算会丢失精度。可以使用BigDecimal进行计算。

  1. import java.math.BigDecimal;  
  2. import org.junit.Test;  
  3. public class TestBigDecimal{  
  4.   @Test  
  5.   public void test(){  
  6.       double a=0.1;  
  7.       double b=0.2;  
  8.       System.out.println(a+b);  
  9.   
  10.       BigDecimal a1=new BigDecimal("0.1");  
  11.   
  12.       BigDecimal b1=new BigDecimal("0.2");  
  13.   
  14.       System.out.println(a1+b1);  
  15.       BigDecimal c1=new BigDecimal("0.23574");  
  16.       a1=a1.add(c1);  
  17.       a1=a1.setScale(1,BigDecimal.ROUND_DOWN);  
  18.       System.out.println(a1);  
  19.   }  
  20. }  


输出结果如下:

0.30000000000000004

0.3
0.3

double的加减无法精确计算出0.3,而使用BigDecimal却可以。

当然,如果直接将double传给BigDecimal,你会发现不但无法解决精度问题,反而对精度进行了补全。所以,为确保精度,我们将String传给它。


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都没有问题,设得更大,肯定不会出错)

add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

例:BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);

----结果:----- mData=9.66

toString()                将BigDecimal对象的数值转换成字符串。
doubleValue()          将BigDecimal对象中的值以双精度数返回。
floatValue()             将BigDecimal对象中的值以单精度数返回。
longValue()             将BigDecimal对象中的值以长整数返回。
intValue()               将BigDecimal对象中的值以整数返回。


posted @ 2017-12-20 11:16  星朝  阅读(1297)  评论(0编辑  收藏  举报