解決double型別相減有誤差的問題
今天在寫指令碼時發現double 型別的相減 跟實際結果有誤差,如 :19.9-9.9=9.9999999999999,而不是10,百度後發現double相減會轉換成二進位制,因double有效位數為 16位這就會出現儲存小數位數不夠的情況,這種情況下就會出現誤差,解決方法就是使用BigDecimal,它的有效長度足夠長可儲存 小數位數因此可代替double來進行加減乘除,下面為BigDecimal的用法:
序號 |
方 法 |
型別 |
描 述 |
1 |
public BigDecimal(double val) |
構造 |
將double表示形式轉換 為BigDecimal |
2 |
public BigDecimal(int val) |
構造 |
將int表示形式轉換為 BigDecimal |
3 |
public BigDecimal(String val) |
構造 |
將字串表示 形式轉換為BigDecimal |
4 |
public BigDecimal add(BigDecimal augend) |
普通 |
加法 |
5 |
public BigDecimal subtract(BigDecimal |
普通 |
減法 |
6 |
public BigDecimal multiply(BigDecimal |
普通 |
乘法 |
7 |
public BigDecimal divide(BigDecimal |
普通 |
除法 |
//兩個Double數相加
public static Double add(Double v1,Double v2){
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.add(b2).doubleValue();
}
//兩個Double數相減
public static Double sub(Double v1,Double v2){
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.subtract(b2).doubleValue();
}
// 兩個Double數相乘
public static Double mul(Double v1,Double v2){
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.multiply(b2).doubleValue();
}
//兩個Double數相除
public static Double div(Double v1,Double v2){
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
}
//兩個Double數相除,並保留scale位小數
public static Double div(Double v1,Double v2,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
//進行四捨五入
BigDecimal b1 = new BigDecimal(d);
BigDecimal b2 = new BigDecimal(1);
// 任何一個數字除以1都是原數字
// ROUND_HALF_UP是BigDecimal的一個常量,
表示進行四捨五入的操作
return b1.divide(b2, len,BigDecimal.
ROUND_HALF_UP).doubleValue();
}
更多關於BigDecimal的用法詳見:http://www.apihome.cn/api/java/BigDecimal.html
相關文章
- Double型別精度問題引起的錯誤型別
- Double型別轉換成BigDicimal問題型別
- 日期型別有問題,如何解決?型別
- Double型別數值相加導致精度缺失問題型別
- 如何用double hashing解決collision resolution問題
- 減治法解決假幣問題
- Java浮點數float,bigdecimal和double精確計算的精度誤差問題總結JavaDecimal
- 雲伺服器composer相關錯誤問題解決伺服器
- 機器學習4-模型的誤差來源以及減少誤差的方法機器學習模型
- 解決 ngrok 的 Domain 錯誤問題AI
- java double、float型別的比較Java型別
- 解決MongoDB儲存時間時差的問題MongoDB
- 決策樹減支問題(優化)dfs減支問題優化
- android gson 擴充套件, 序列化int型別被轉double 問題Android套件型別
- 問題解決方法有三
- 有關ocssd程式的問題解決:CSS
- svn相關問題解決辦法
- javascript如何解決浮點數相乘出現誤差問題JavaScript
- oracle timestamp轉換date及date型別相減Oracle型別
- JAVA型別的問題Java型別
- 語法錯誤 : 缺少“;”(在“型別”的前面)的解決方案型別
- 怎樣解決程式語言之間的差異性問題?
- 解決機器學習問題有通法機器學習
- 解決相鄰圖片之間的空隙問題
- 解決mysql_query()報錯的相關問題MySql
- J2SE-double 型別相加型別
- 問題:JSON的格式型別到底有哪些呢?JSON型別
- 使用 requests 2.11 版本時的 Site ID 型別問題及解決方案型別
- Java將引入新的物件型別來解決記憶體利用問題Java物件型別記憶體
- Oracle 常見的錯誤問題及解決方法Oracle
- float和double有什麼區別?
- 解決「問題」,不要解決問題
- redis快取相關問題及解決方案Redis快取
- 用SQL解決有向圖問題SQL
- java中文問題和資料庫型別有關Java資料庫型別
- Java泛型型別擦除問題Java泛型型別
- TRIZ在減少人為誤差原理上的應用
- 應用TRIZ理論解決AGV產品靈活性差的問題