美文网首页
微信支付缺少1分钱问题

微信支付缺少1分钱问题

作者: wangxiaoda | 来源:发表于2017-03-03 18:47 被阅读1655次

问题起因

商品价格为19.9元,微信调起支付价格为19.89

深挖原因如下

微信官方文档规定:

交易金额
交易金额默认为人民币交易,接口中参数支付金额单位为【分】,参数值不能带小数。对账单中的交易金额单位为【元】。
外币交易的支付金额精确到币种的最小单位,参数值不能带小数点。

支付宝没有这种规定,并不会产生这种问题。

问题是double*100丢失精度造成的
问题代码:

double v = Double.valueOf("19.9")* 100;
int fee = Double.valueOf(v).intValue();

猜下这个fee的值会是多少?答案:19.89
是不是很无语。。。
想让Double不丢失精度,要用BigDecimal处理
测试代码如下:

public static void main(String args[]){
        
        double v = Double.valueOf("19.9")* 100;
        int fee = Double.valueOf(v).intValue();
        System.out.println(fee);

        BigDecimal v1 = new BigDecimal("19.9");
        BigDecimal v2 = new BigDecimal("100");
        Double b = v1.multiply(v2).doubleValue();
        int fee1 = b.intValue();
        System.out.println(fee1);
    
    }

打印结果:

Paste_Image.png

如上图,BigDecimal类型的乘法可以很好的解决这种精度问题。

BigDecimal精确运算使用总结

加法:

public static double add(double value1,double value2){
    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
    BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
    return b1.add(b2).doubleValue();
}

减法:

public static double sub(double value1,double value2){
   BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
   BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
   return b1.subtract(b2).doubleValue();
}

乘法:

public static double mul(double value1,double value2){
   BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
   BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
   return b1.multiply(b2).doubleValue();
}

除法:

public static double div(double value1,double value2,int scale) throws IllegalAccessException{
   //如果精确范围小于0,抛出异常信息
   if(scale<0){ 
     throw new IllegalAccessException("精确度不能小于0");
   }
   BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
   BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
   return b1.divide(b2, scale).doubleValue();
}

相关文章

网友评论

      本文标题:微信支付缺少1分钱问题

      本文链接:https://www.haomeiwen.com/subject/amprgttx.html