在浮點數當中做運算時經常會出現精度丟失的情況,如果做項目不作處理的話會對商家造成很大的影響的。項目尤其是金融相關的項目對這些運算的精度要求較高。 問題原因:首先電腦進行的是二進位運算,我們輸入的十進位數字會先轉換成二進位,進行運算後再轉換為十進位輸出。Float和Double提供了快速的運算,然而 ...
在浮點數當中做運算時經常會出現精度丟失的情況,如果做項目不作處理的話會對商家造成很大的影響的。項目尤其是金融相關的項目對這些運算的精度要求較高。
問題原因:首先電腦進行的是二進位運算,我們輸入的十進位數字會先轉換成二進位,進行運算後再轉換為十進位輸出。Float和Double提供了快速的運算,然而問題在於轉換為二進位的時候,有些數字不能完全轉換,只能無限接近於原本的值,這就導致了在後來的運算會出現不正確結果的情況。
首先看到沒有做處理的代碼和結果:
public static void main(String[] args) { System.out.println(0.03-0.02); }
結果:
0.009999999999999998
處理過得代碼和結果:
public static void main(String[] args) { //定義浮點型參數 double d1=0.03; double d2=0.02; //double類型轉換成String 然後BigDecimal類構造器里 BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDecimal b2 = new BigDecimal(Double.toString(d2)); //BigDecimal類里內置計算方法 BigDecimal b3=b1.subtract(b2);//減法 //輸出 System.out.println(b3); }
結果:
0.01
簡單封裝了一個計算類(加、減、乘、除):
package edu.nf.demo; import java.math.BigDecimal; public class CalculatorUtil { /** * 加法 * @return */ public static double add(double d1, double d2) { BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDecimal b2 = new BigDecimal(Double.toString(d2)); return b1.add(b2).doubleValue(); } /** * 減法 * @return */ public static double subtract(double d1, double d2) { BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDecimal b2 = new BigDecimal(Double.toString(d2)); return b1.subtract(b2).doubleValue(); } /** * 乘法 * @return */ public static double multiply(double d1, double d2) { BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDecimal b2 = new BigDecimal(Double.toString(d2)); return b1.multiply(b2).doubleValue(); } /** * 除法 * @return */ public static double divide(double d1, double d2) { BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDecimal b2 = new BigDecimal(Double.toString(d2)); return b1.divide(b2).doubleValue(); } }