貨幣計算避免用Float或Double,會丟失精度。建議用BigDecimal
使用場景
最近在做小程序支付功能,微信提供的統一下單接口金額單位為分,於是需要將金額從元轉為分
最開始使用Float進行計算
public static void main(String[] args) { //0.01元 String fee = "0.01"; //轉為1分 int money = (int)(Float.parseFloat(fee)*100); System.out.println(money); }
0.01元轉為1分是沒有問題的,換了一個較大的金額“9999999”,結果計算出來的值為9999998.72
float和double類型主要是為了科學計算和工程計算而設計的。他們執行二進制浮點運算,這是為了在廣泛的數字范圍上提供較為精確的快速近似計算而精心設計的。然而它們並沒有提供完全精確的結果,所以我們不應該用於精確計算的場合。float和double類型尤其不適合用於貨幣運算,因為要讓一個float或double精確的表示0.1或者10的任何其他負數次方值是不可能的(其實道理很簡單,十進制系統中能不能准確表示出1/3呢?同樣二進制系統也無法准確表示1/10)。浮點運算很少是精確的,只要是超過精度能表示的范圍就會產生誤差。往往產生誤差不是因為數的大小,而是因為數的精度。因此,產生的結果接近但不等於想要的結果。尤其在使用 float 和 double 作精確運算的時候要特別小心,比如貨幣金額計算。
解決這個問題的正確辦法是使用BigDecimal進行貨幣金額計算
使用BigDecimal
public static void main(String[] args) { //金額,單位元 String fee = "9999999"; BigDecimal decimal1 = new BigDecimal(fee); BigDecimal decimal2= new BigDecimal(100); //金額,單位轉為分 int money = decimal1.multiply(decimal2).intValue(); System.out.println(money); //9999999 }
參考地址
貨幣計算請避免使用float和double https://www.jianshu.com/p/1a6faab3cae4