Java中BigDecimal的使用(1.01+2.02=3.0300000000000002)
轉載於:https://blog.csdn.net/cen_s/article/details/76472834
在日常開發中我們經常會碰到小數計算,而小數直接計算的話會出現一些小小的錯誤,如下
System.out.println(1.01 + 2.02);
你說能輸出什麼?3.03?實際上輸出的是3.0300000000000002。這是因為不論是float 還是double都是浮點數,而計算機是二進位制的,浮點數會失去一定的精確度。有沒有不失精度的辦法呢?這裡就要用到BigDecimal了。
java.math.BigDecimal。Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變數double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是工程計算,在商業計算中要用java.math.BigDecimal。BigDecimal所建立的是物件,我們不能使用傳統的+、-、*、/等算術運算子直接對其物件進行數學運算,而必須呼叫其相對應的方法。方法中的引數也必須是BigDecimal的物件。構造器是類的特殊方法,專門用來建立物件,特別是帶有引數的物件。
建立BigDecimal物件主要有兩種。
- BigDecimal b1 = new BigDecimal("1.34");//1.34
- BigDecimal b2 = BigDecimal.valueOf(1.34);//1.34
其中b1也可以寫成new BigDecimal(Double.toString(1.34)),可以直接new BigDecimal(1.34)嗎,也是可以的,只是會出現上述的精度問題。
- BigDecimal one1 = new BigDecimal(1.34);//1.3400000000000000799360577730112709105014801025390625
- BigDecimal two1 = new BigDecimal("1.34");//1.34
除了這兩種外,特殊的像0、1、10可以這樣寫。
BigDecimal zero = BigDecimal.ZERO; BigDecimal one = BigDecimal.ONE; BigDecimal ten = BigDecimal.TEN;
- public static BigDecimal valueOf(long val) {
- if (val >= 0 && val < zeroThroughTen.length)
- return zeroThroughTen[(int)val];
- else if (val != INFLATED)
- return new BigDecimal(null, val, 0, 0);
- return new BigDecimal(INFLATED_BIGINT, val, 0, 0);
- }
- // Cache of common small BigDecimal values.
- private static final BigDecimal zeroThroughTen[] = {
- new BigDecimal(BigInteger.ZERO, 0, 0, 1),
- new BigDecimal(BigInteger.ONE, 1, 0, 1),
- new BigDecimal(BigInteger.valueOf(2), 2, 0, 1),
- new BigDecimal(BigInteger.valueOf(3), 3, 0, 1),
- new BigDecimal(BigInteger.valueOf(4), 4, 0, 1),
- new BigDecimal(BigInteger.valueOf(5), 5, 0, 1),
- new BigDecimal(BigInteger.valueOf(6), 6, 0, 1),
- new BigDecimal(BigInteger.valueOf(7), 7, 0, 1),
- new BigDecimal(BigInteger.valueOf(8), 8, 0, 1),
- new BigDecimal(BigInteger.valueOf(9), 9, 0, 1),
- new BigDecimal(BigInteger.TEN, 10, 0, 2),
- };
發現10以內的物件都是同一個,所以為true。
BigDecimal的加減乘除運算。
- public BigDecimal add(BigDecimal value);//加法
- public BigDecimal subtract(BigDecimal value);//減法
- public BigDecimal multiply(BigDecimal value);//乘法
- public BigDecimal divide(BigDecimal value);//除法
也可以照下面加法例子寫成一個util,另外三個都差不多就不展開了。
- public static double add(double value1,double value2){
- BigDecimal b1 = new BigDecimal(Double.toString(value1));
- BigDecimal b2 = new BigDecimal(Double.toString(value2));
- return b1.add(b2).doubleValue();
- }
BigDecimal的運算都沒有對原值進行操作,而是返回一個新的BigDecimal物件,這點可能有些小夥伴會搞錯要注意一下。
- BigDecimal b1 =new BigDecimal("1.34");
- System.out.println("b1: " + b1);
- BigDecimal b2 =new BigDecimal("2.34");
- b1.add(b2);
- System.out.println("b1: " + b1);//b1並沒有變
BigDecimal的比較用的是BigDecimal的compareTo方法,將此 BigDecimal 與指定的 BigDecimal 比較。
根據此方法,值相等但具有不同標度的兩個BigDecimal物件(如,2.0 和 2.00)被認為是相等的。
當此 BigDecimal 在數字上小於、等於或大於被比較物件時,返回 -1、0 或 1。
- BigDecimal one = BigDecimal.valueOf(1);
- BigDecimal two = BigDecimal.valueOf(2);
- BigDecimal three = one.add(two);
- int i1 = one.compareTo(two);//-1
- int i2 = two.compareTo(two);//0
- int i3 = three.compareTo(two);//1
</div>
相關文章
- java中的BigDecimalJavaDecimal
- Java BigDecimal使用指南JavaDecimal
- Java的BigDecimal比較大小JavaDecimal
- Java 中比較 BigDecimal 的陷阱JavaDecimal
- Java大數相乘(使用BigInteger和BigDecimal)JavaDecimal
- java保留2位小數及BigDecimal使用JavaDecimal
- BigDecimal使用注意的地方Decimal
- (Java筆記)BigDecimal類Java筆記Decimal
- Java之BigDecimal詳解JavaDecimal
- java.math.BigDecimal用法JavaDecimal
- Java深海拾遺系列(5)--- 精度計算中的BigDecimal,double和floatJavaDecimal
- Java之BigDecimal(存任意精度的浮點型)JavaDecimal
- 又踩坑了!BigDecimal使用的5個坑!Decimal
- BigDecimalDecimal
- java學習之BigInteger類、BigDecimal類JavaDecimal
- org.apache.jasper.JasperException: java.math.BigDecimalApacheExceptionJavaDecimal
- 好程式設計師Java培訓分享BigDecimal的用法程式設計師JavaDecimal
- Java中BasicNameValuePair的使用JavaAI
- Java 中 RMI 的使用Java
- 工作學習筆記(十)Java 中 “<” 運算子不能應用於BigDecimal和double筆記JavaDecimal
- Java中的Reference類使用Java
- REST 在 Java 中的使用RESTJava
- Java 中佇列的使用Java佇列
- oracle中java source的使用OracleJava
- java中 foreach 的使用Java
- java基礎學習之十一:BigDecimal和BigIntegerJavaDecimal
- 商業計算Java高精度計算BigDecimal類JavaDecimal
- BigDecimal 詳解Decimal
- BigDecimal計算Decimal
- BigDecimal總結Decimal
- Java中各種Log的使用Java
- java中Cglib代理的使用JavaCGLib
- Java中Lambda表示式的使用Java
- Java 中的陣列 如何使用Java陣列
- java中break標記的使用Java
- java中try catch塊的使用Java
- 淺談 Java 中 this 的使用(轉)Java
- BigDecimal的divide方法報錯DecimalIDE