货币金额计算(JAVA)

货币计算避免用Float或Double,会丢失精度。建议用BigDecimal

使用场景

  最近在做小程序支付功能,微信提供的统一下单接口金额单位为分,于是需要将金额从元转为分

  最开始使用Float进行计算

public static void main(String[] args) {
        //0.01元
        String fee = "0.01";
        //转为1分
        int money = (int)(Float.parseFloat(fee)*100);
        System.out.println(money);
    }

0.01元转为1分是没有问题的,换了一个较大的金额“9999999”,结果计算出来的值为9999998.72

  float和double类型主要是为了科学计算和工程计算而设计的。他们执行二进制浮点运算,这是为了在广泛的数字范围上提供较为精确的快速近似计算而精心设计的。然而它们并没有提供完全精确的结果,所以我们不应该用于精确计算的场合。float和double类型尤其不适合用于货币运算,因为要让一个float或double精确的表示0.1或者10的任何其他负数次方值是不可能的(其实道理很简单,十进制系统中能不能准确表示出1/3呢?同样二进制系统也无法准确表示1/10)。浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。尤其在使用 float 和 double 作精确运算的时候要特别小心,比如货币金额计算。

解决这个问题的正确办法是使用BigDecimal进行货币金额计算

使用BigDecimal

public static void main(String[] args) {
    //金额,单位元
    String fee = "9999999";
    BigDecimal decimal1 = new BigDecimal(fee);
    BigDecimal decimal2= new BigDecimal(100);
    //金额,单位转为分
    int money =  decimal1.multiply(decimal2).intValue();
    System.out.println(money); //9999999
}

参考地址 

货币计算请避免使用float和double https://www.jianshu.com/p/1a6faab3cae4

原文地址:https://www.cnblogs.com/kiko2014551511/p/11610971.html