double、float类型进行运算造成精度丢失的问题解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liu_jing_hui/article/details/78928170

在操作的过程中,我们无意中会造成精度丢失。遇到这个问题我们进行如何解决呢?大家不要慌,本文是来介绍精度丢失的问题。

我们来看一下如下的代码:

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

猜你喜欢

转载自blog.csdn.net/liu_jing_hui/article/details/78928170