Java中计算导致的精度问题

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

先说下我遇到的问题:

App做调用微信充值功能,输入框明明输入的是0.57,但是调用微信支付的时候却成了0.56

一脸懵逼...

查原因:

拿到输入框中的内容, 转换成double类型后  乘以 100,通过log 发现 变成了 56.999999999

(计算过程中  计算机转化成二进制计算会产生一些失精)

然后强转成 int 类型就变成了  56,调用微信的时候api传参是要 单位为分的

问了主管用:

BigDecimal
封装了工具类:
package com.temiao.jiansport.utils;

import java.math.BigDecimal;

/**
 * ==================================
 * Created by 边江洲 on 2018/8/29.
 * 作    者:WY_BJZ
 * 创建时间:2018/8/29
 * ==================================
 */
/*
 类 说 明:

 运算工具类
 解决运算过程中的失精问题(二进制产生)

 参数描述:
 
 
*/
public class TMCalculateUtil {

    /* 加法 */
    public static double jia(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.add(b2).doubleValue();
    }

    public static int jia(int value1, int value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.add(b2).intValue();
    }

    public static float jia(float value1, float value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.add(b2).floatValue();
    }

    /* 减法(第一个数减第二个数) */
    public static double jian(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.subtract(b2).doubleValue();
    }

    public static int jian(int value1, int value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.subtract(b2).intValue();
    }

    public static float jian(float value1, float value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.subtract(b2).floatValue();
    }

    /* 乘法 */
    public static double cheng(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.multiply(b2).doubleValue();
    }

    public static int cheng(int value1, int value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.multiply(b2).intValue();
    }

    public static float cheng(float value1, float value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.multiply(b2).floatValue();
    }

    /* 除法(第一个数除以第二个数) */
    public static double chu(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.divide(b2).doubleValue();
    }

    public static int chu(int value1, int value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.divide(b2).intValue();
    }

    public static float chu(float value1, float value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.divide(b2).floatValue();
    }


}

调用方法:

TMCalculateUtil.cheng(Utils.getDouble(inputFee)

好吧,小费了了一些时间处理了///

猜你喜欢

转载自blog.csdn.net/baidu_35192370/article/details/82186434