1. 程式人生 > >double、float型別進行運算造成精度丟失的問題解決

double、float型別進行運算造成精度丟失的問題解決

在操作的過程中,我們無意中會造成精度丟失。遇到這個問題我們進行如何解決呢?大家不要慌,本文是來介紹精度丟失的問題。

我們來看一下如下的程式碼:

        double price1 = 10.01d;
        double price2 = 10.0d;
        double v = price1 - price2;
        Log.e("double====", "init: "+v );

按理說兩個數相減出來的結果是0.01,可事實並非如我們所想。我們來看一下下面的列印結果。

12-29 09:09:04.001 9674-9674/com.wekair.app E/double====: init: 0.009999999999999787

發現打印出來的結果是0.009999999999999787 這一串數字,結果造成了精度丟失的問題。下面我們來看一下解決辦法:

1.錯誤的解決方法:

        double price1 = 10.01d;
        double price2 = 10.0d;
        BigDecimal bigDecimal = new BigDecimal(price1);
        BigDecimal bigDecimal1 = new BigDecimal(price2);
        Log.e("double====", "init: "+bigDecimal.subtract(bigDecimal1) );

我們看一下上面的程式碼使用BigDecimal 物件傳入兩個價格:按理說應該解決了問題,結果事實並如我們所想,我們來看一下真實的列印結果:

12-29 09:21:34.084 11165-11165/com.wekair.app E/double====: init: 0.0099999999999997868371792719699442386627197265625

2.正確的解決的辦法:我們把錯誤方法中的傳入的double型別的價格改成String型別,修改後的程式碼如下:

        double price1 = 10.01d;
        double price2 = 10.0
d; BigDecimal bigDecimal = new BigDecimal(Double.toString(price1)); BigDecimal bigDecimal1 = new BigDecimal(Double.toString(price2)); Log.e("double====", "init: "+bigDecimal.subtract(bigDecimal1) );

我們先來看一下列印結果,如下結果:

12-29 09:27:11.361 11745-11745/com.wekair.app E/double====: init: 0.01

為了大家更好的使用,我封裝了一個工具類讓大家來使用,來實現加減乘除功能。

package com.wekair.app.utils;

import java.math.BigDecimal;

/**
 * File Name:BigDecimalUtil
 * Author:jinghui liu
 * Created Time:2017/12/28 14:49
 */

public class BigDecimalUtil {

    /**
     * add
     *
     * @param number1
     * @param number2
     * @return
     */
    public static double add(double number1, double number2) {
        BigDecimal bigDecimal = new BigDecimal(Double.toString(number1));
        BigDecimal bigDecimal1 = new BigDecimal(Double.toString(number2));
        return bigDecimal.add(bigDecimal1).doubleValue();
    }

    /**
     * subtract
     *
     * @param number1
     * @param number2
     * @return
     */
    public static double sub(double number1, double number2) {
        BigDecimal bigDecimal = new BigDecimal(Double.toString(number1));
        BigDecimal bigDecimal1 = new BigDecimal(Double.toString(number2));
        return bigDecimal.subtract(bigDecimal1).doubleValue();
    }

    /**
     * multiply
     * @param number1
     * @param number2
     * @return
     */
    public static double mul(double number1, double number2) {
        BigDecimal bigDecimal = new BigDecimal(Double.toString(number1));
        BigDecimal bigDecimal1 = new BigDecimal(Double.toString(number2));
        return bigDecimal.multiply(bigDecimal1).doubleValue();
    }

    /**
     * div
     *
     * @param number1
     * @param number2
     * @param scale
     * @return
     */
    public static double div(double number1, double number2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("Parameter error");
        }
        BigDecimal p1 = new BigDecimal(Double.toString(number1));
        BigDecimal p2 = new BigDecimal(Double.toString(number2));
        return p1.divide(p2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}