金融項目java開發_BigDecimal(解決計算精度問題)

來源:互聯網
上載者:User

標籤:splay   font   tostring   osi   span   gpo   mda   double   原來   

當使用double進行商業運算時,double計算會丟失精度。可以使用BigDecimal進行計算。

[java] view plain copy print?
  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. }  
import java.math.BigDecimal;import org.junit.Test;public class TestBigDecimal{  @Test  public void test(){      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+b1);//不要這麼寫      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

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.4setScaler(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對象中的值以整數返回。


金融項目java開發_BigDecimal(解決計算精度問題)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.