BigDecimal加減乘除計算

BigDecimal的運算——加減乘除
首先是bigdecimal的初始化
這裏對比了兩種形式,第一種直接value寫數字的值,第二種用string來表示html

BigDecimal num1 = new BigDecimal(0.005);
BigDecimal num2 = new BigDecimal(1000000);
BigDecimal num3 = new BigDecimal(-1000000);
//儘可能用字符串的形式初始化
BigDecimal num12 = new BigDecimal("0.005");
BigDecimal num22 = new BigDecimal("1000000");
BigDecimal num32 = new BigDecimal("-1000000");
咱們對其進行加減乘除絕對值的運算java

其實就是Bigdecimal的類的一些調用ide

加法 add()函數     減法subtract()函數
乘法multiply()函數    除法divide()函數    絕對值abs()函數
我這裏承接上面初始化Bigdecimal分別用string和數進行運算對比函數

//加法
BigDecimal result1 = num1.add(num2);
BigDecimal result12 = num12.add(num22);

//減法
BigDecimal result2 = num1.subtract(num2);
BigDecimal result22 = num12.subtract(num22);

//乘法
BigDecimal result3 = num1.multiply(num2);
BigDecimal result32 = num12.multiply(num22);

//絕對值
BigDecimal result4 = num3.abs();
BigDecimal result42 = num32.abs();

//除法
BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP);
BigDecimal result52 = num22.divide(num12,20,BigDecimal.ROUND_HALF_UP);
我把result所有輸出能夠看到結果.net

這裏出現了差別,這也是爲何初始化建議使用string的緣由htm

 

 

 

※ 注意:
1)System.out.println()中的數字默認是double類型的,double類型小數計算不精準。blog

2)使用BigDecimal類構造方法傳入double類型時,計算的結果也是不精確的!ip

由於不是全部的浮點數都可以被精確的表示成一個double 類型值,有些浮點數值不可以被精確的表示成 double 類型值,所以它會被表示成與它最接近的 double 類型的值。必須改用傳入String的構造方法。這一點在BigDecimal類的構造方法註釋中有說明。ci

完整的test代碼以下:字符串

import java.math.BigDecimal;
import java.util.Scanner;

public class TestThree {

public static void main(String[] args) {

BigDecimal num1 = new BigDecimal(0.005);
BigDecimal num2 = new BigDecimal(1000000);
BigDecimal num3 = new BigDecimal(-1000000);
//儘可能用字符串的形式初始化
BigDecimal num12 = new BigDecimal("0.005");
BigDecimal num22 = new BigDecimal("1000000");
BigDecimal num32 = new BigDecimal("-1000000");

//加法
BigDecimal result1 = num1.add(num2);
BigDecimal result12 = num12.add(num22);
//減法
BigDecimal result2 = num1.subtract(num2);
BigDecimal result22 = num12.subtract(num22);
//乘法
BigDecimal result3 = num1.multiply(num2);
BigDecimal result32 = num12.multiply(num22);
//絕對值
BigDecimal result4 = num3.abs();
BigDecimal result42 = num32.abs();
//除法
BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP);
BigDecimal result52 = num22.divide(num12,20,BigDecimal.ROUND_HALF_UP);

System.out.println("加法用value結果:"+result1);
System.out.println("加法用string結果:"+result12);

System.out.println("減法value結果:"+result2);
System.out.println("減法用string結果:"+result22);

System.out.println("乘法用value結果:"+result3);
System.out.println("乘法用string結果:"+result32);

System.out.println("絕對值用value結果:"+result4);
System.out.println("絕對值用string結果:"+result42);

System.out.println("除法用value結果:"+result5);
System.out.println("除法用string結果:"+result52);
}
}
除法divide()參數使用
使用除法函數在divide的時候要設置各類參數,要精確的小數位數和舍入模式,否則會出現報錯

咱們能夠看到divide函數配置的參數以下

 

即爲 (BigDecimal divisor 除數, int scale 精確小數位, int roundingMode 舍入模式)
能夠看到舍入模式有不少種BigDecimal.ROUND_XXXX_XXX, 具體都是什麼意思呢

 

 

 

計算1÷3的結果(最後一種ROUND_UNNECESSARY在結果爲無限小數的狀況下會報錯)

 

 

 

八種舍入模式解釋以下
一、ROUND_UP

舍入遠離零的舍入模式。

在丟棄非零部分以前始終增長數字(始終對非零捨棄部分前面的數字加1)。

注意,此舍入模式始終不會減小計算值的大小。

二、ROUND_DOWN

接近零的舍入模式。

在丟棄某部分以前始終不增長數字(從不對捨棄部分前面的數字加1,即截短)。

注意,此舍入模式始終不會增長計算值的大小。

三、ROUND_CEILING

接近正無窮大的舍入模式。

若是 BigDecimal 爲正,則舍入行爲與 ROUND_UP 相同;

若是爲負,則舍入行爲與 ROUND_DOWN 相同。

注意,此舍入模式始終不會減小計算值。

四、ROUND_FLOOR

接近負無窮大的舍入模式。

若是 BigDecimal 爲正,則舍入行爲與 ROUND_DOWN 相同;

若是爲負,則舍入行爲與 ROUND_UP 相同。

注意,此舍入模式始終不會增長計算值。

五、ROUND_HALF_UP

向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。

若是捨棄部分 >= 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同。

注意,這是咱們大多數人在小學時就學過的舍入模式(四捨五入)。

六、ROUND_HALF_DOWN

向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲上舍入的舍入模式。

若是捨棄部分 > 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同(五舍六入)。

七、ROUND_HALF_EVEN

向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。

若是捨棄部分左邊的數字爲奇數,則舍入行爲與 ROUND_HALF_UP 相同;

若是爲偶數,則舍入行爲與 ROUND_HALF_DOWN 相同。

注意,在重複進行一系列計算時,此舍入模式能夠將累加錯誤減到最小。

此舍入模式也稱爲「銀行家舍入法」,主要在美國使用。四捨六入,五分兩種狀況。

若是前一位爲奇數,則入位,不然捨去。

如下例子爲保留小數點1位,那麼這種舍入方式下的結果。

1.15>1.2 1.25>1.2

八、ROUND_UNNECESSARY

斷言請求的操做具備精確的結果,所以不須要舍入。

若是對得到精確結果的操做指定此舍入模式,則拋出ArithmeticException。

http://www.bdqn.cn/news/201311/11834.shtml————————————————版權聲明:本文爲CSDN博主「haiyinshushe」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/haiyinshushe/article/details/82721234

相關文章
相關標籤/搜索