double、float型別進行運算造成精度丟失的問題解決
阿新 • • 發佈:2019-01-05
在操作的過程中,我們無意中會造成精度丟失。遇到這個問題我們進行如何解決呢?大家不要慌,本文是來介紹精度丟失的問題。
我們來看一下如下的程式碼:
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();
}
}