版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}