貨幣計算避免用Float或Double,會丟失精度。建議用BigDecimal小程序
使用場景微信
最近在作小程序支付功能,微信提供的統一下單接口金額單位爲分,因而須要將金額從元轉爲分spa
最開始使用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.72code
float和double類型主要是爲了科學計算和工程計算而設計的。他們執行二進制浮點運算,這是爲了在普遍的數字範圍上提供較爲精確的快速近似計算而精心設計的。然而它們並無提供徹底精確的結果,因此咱們不該該用於精確計算的場合。float和double類型尤爲不適合用於貨幣運算,由於要讓一個float或double精確的表示0.1或者10的任何其餘負數次方值是不可能的(其實道理很簡單,十進制系統中能不能準確表示出1/3呢?一樣二進制系統也沒法準確表示1/10)。浮點運算不多是精確的,只要是超過精度能表示的範圍就會產生偏差。每每產生偏差不是由於數的大小,而是由於數的精度。所以,產生的結果接近但不等於想要的結果。尤爲在使用 float 和 double 做精確運算的時候要特別當心,好比貨幣金額計算。blog
解決這個問題的正確辦法是使用BigDecimal進行貨幣金額計算接口
使用BigDecimalip
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 }
參考地址 ci
貨幣計算請避免使用float和double https://www.jianshu.com/p/1a6faab3cae4get