BigDecimal類和以BigDecimal類為基礎定義類Arith工具類
阿新 • • 發佈:2018-12-15
一、認識
float和double兩種資料型別容易引起精度的丟失,所以java提供BigDecimal類提高精度。該類提供了大量的構造器用於 建立BigDecimal 物件,把所有的基本數值型別變數轉換成一個BigDecimal物件。
二、常用的兩個構造器:
1、BigDecimal(double value):不推薦使用該構造器,因為當使用new BigDecimal(0.1)來建立一個物件時,它的值不是0.1,而實際上是一個近似0.1的值,表面看著是個0.1。
2、BidDiecimal(String value):推薦使用這個構造器,newBigDecimal("0.1")來建立一個物件時,得到的和預期的一樣是個0.1的值。
注意如果非要接收一個double的值得話,可以通過BigDecimal.valueOf(double value)靜態方法來建立物件。例如:
BigDecimal f2 = BigDecimal.valueOf(0.01);
三、基本操作
add(BigDecimal value):精確加法
subtract(BigDecimal value):精確減法
multiply(BigDecimal value):精確乘法
divide(BigDecimal value);精確除法
四、java實現
import java.math.BigDecimal; public class BigDecimalTest { public static void main(String[] args){ BigDecimal f1 = new BigDecimal("0.05"); BigDecimal f2 = BigDecimal.valueOf(0.01); BigDecimal f3 = new BigDecimal(0.05); System.out.println(f1); System.out.println("使用String作為BigDecimal構造器引數"); System.out.println(f2); System.out.println("0.05 + 0.01 = " + f1.add(f2)); System.out.println("0.05 - 0.01=" + f1.subtract(f2)); System.out.println("0.05 * 0.01=" + f1.multiply(f2)); System.out.println("0.05 / 0.01=" + f1.divide(f2)); System.out.println("使用double作為BigDecimal構造器引數:"); System.out.println("0.05 + 0.01 =" + f3.add(f2)); System.out.println("0.05 - 0.01 =" + f3.subtract(f2)); System.out.println("0.05 * 0.01 =" + f3.multiply(f2)); System.out.println("0.05 / 0.01 =" + f3.divide(f2)); } }
結果:
五、Arith工具類
過程:先將double數值包裝成BigDecimal型別,運算出結果後,再轉成double型別。
java實現:
import java.math.BigDecimal; public class Arith { //預設除法運算精度 private static final int DEF_DIV_SCALE = 10; //構造器私有,讓這個類不能例項化 private Arith(){} //提供精確的加法運算 public static double add(double v1,double v2){ BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.add(b2).doubleValue(); } //提供精確的減法運算 public static double sub(double v1,double v2){ BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.subtract(b2).doubleValue(); } //提供精確的乘法運算 public static double mul(double v1,double v2){ BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.multiply(b2).doubleValue(); } //提供精確的除法運算 public static double div(double v1,double v2){ BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.divide(b2).doubleValue(); } }
//ArithMain類
public class ArithMain {
public static void main(String[] args){
System.out.println("0.06 + 0.02 = " + Arith.add(0.06,0.02));
System.out.println("0.06 - 0.02 = " + Arith.sub(0.06,0.02));
System.out.println("0.06 * 0.02 = " + Arith.mul(0.06,0.02));
System.out.println("-123.3 / 100 = " + Arith.div(-123.3,100));
}
}
結果: