標籤:splay font tostring osi span gpo mda double 原來
當使用double進行商業運算時,double計算會丟失精度。可以使用BigDecimal進行計算。
[java] view plain copy print?
- 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);
- BigDecimal c1=new BigDecimal("0.23574");
- a1=a1.add(c1);
- a1=a1.setScale(1,BigDecimal.ROUND_DOWN);
- System.out.println(a1);
- }
- }
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(解決計算精度問題)