天天看點

Java Double運算精度問題解決

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();
    }
}