杂文工作小记

货币金额的计算 - Java中的BigDecimal

2020-05-09  本文已影响0人  叫子非鱼啊

java中数字的计算事件很烦,也很容易出错的地方,比如网上找来的这样的例子

public class Test {
    public static void main(String[] args) {
        System.out.println(0.05+0.01);
        System.out.println(1.0-0.42);
        System.out.println(4.015*100);
        System.out.println(123.3/100);
    }

}

你觉得他们输出的结果会是多小呢?

0.06 0.58 401.5 1.233

事实是

程序有时候也会给我们开一个玩笑,如果用在金额的计算上将会出现很大的问题。

问题原因呢,当我们用double 、float类型时,计算要千万注意丢失精度的问题。

所以如何计算呢?

BigDecimal进行商业中精度要求较高的计算。


import java.math.BigDecimal;

public class Test {
    public static void main(String[] args) {
        
        double a = 0.05;
        double b = 0.01;
        double c = 1.0;
        double d = 0.42;
        double e = 4.015;
        int f = 100;
        String g = "123.3"; 
        

        
        // 转成BigDecimal类型,注意new时参数转成String类型
        BigDecimal biga = new BigDecimal(Double.toString(a));
        BigDecimal bigb = new BigDecimal(Double.toString(b));
        BigDecimal bigc = new BigDecimal(Double.toString(c));
        BigDecimal bigd = new BigDecimal(Double.toString(d));
        BigDecimal bige = new BigDecimal(Double.toString(e));
        BigDecimal bigf = new BigDecimal(Double.toString(f));
        BigDecimal bigg = new BigDecimal(g);
                                                       
        
        System.out.println(biga.add(bigb)); // 加法
        System.out.println(bigc.subtract(bigd)); // 減法
        System.out.println(bige.multiply(bigf)); // 乘法
        System.out.println(bigg.divide(bigf)); // 除法
    }

}

结果

0.05
0.06
0.58
401.5000
1.233

关于详细的BigDecimal详细的介绍看Java之BigDecimal详解

关于金额的格式化里边也有详细的介绍,计算的精度等(这里推荐看一下银行家舍入算法
)。

上一篇下一篇

猜你喜欢

热点阅读