Double精度丢失原因
先明白計算機在内部進行算術運算的一個流程:計算機會先把要計算的數轉化成二進制,然後通過二進制進行運算,運算好了之後,再轉化為相應的進制輸出。然而,Double類型小數在轉化成計算機的二進制的時候,二進制不能完全表示某些小數,就好像10進制中也會出現無限小數一樣,因而就造成了精度的丢失,是以運算完成後結果是錯誤的。
解決辦法
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* 解決Double運算精度問題
* @title DoubleUtils.java
* @date 2018年2月1日
*
*/
public class DoubleUtils {
/**
* @title 解決double加法精度問題
*/
public static double add(Double... doubles){
BigDecimal result = new BigDecimal();
for(Double a : doubles){
result = result.add(new BigDecimal(String.valueOf(a)));
}
return result.doubleValue();
}
/**
* @title 解決double乘法精度問題
*/
public static double multiply(Double... doubles){
BigDecimal result = new BigDecimal();
for(Double a : doubles){
result = result.multiply(new BigDecimal(String.valueOf(a)));
}
return result.doubleValue();
}
/**
* @title 解決double除法精度問題
* @param dividend 被除數
* @param divisor 除數
* @param scale 保留小數位數
* @param roundingMode 小數保留模式
*/
public static double divide(Double dividend,Double divisor,int scale,RoundingMode roundingMode){
BigDecimal result = new BigDecimal();
result = new BigDecimal(String.valueOf(dividend)).divide(new BigDecimal(String.valueOf(divisor)), scale, roundingMode);
return result.doubleValue();
}
/**
* @title 解決double減法精度問題
* @param minuend 被減數
* @param subtractor 減數
*/
public static double subtract(Double minuend,Double subtractor){
return new BigDecimal(String.valueOf(minuend))
.subtract(new BigDecimal(String.valueOf(subtractor)))
.doubleValue();
}
}