BigInteger和BigDecimal

634 阅读1分钟

在说这两个类型之前我们先看一段代码:

        double d1=10.01;
        double d2=10.00;
        float f1 = 10.01f;
        float f2 = 10.00f;
        System.out.println(f1-f2);
        System.out.println(d1-d2);

10.01-10.00一定是等于0.01的对吧?但是double输出的结果却是:0.009999999999999787一个比0.01小但接近的数,但是就不是0.01。float的输出结果是0.010000229,这次又比0.01大了。

那么我们有没有什么办法得到准确的0.01呢?如果我们把这两个数同时扩大100倍数在进行运算,再把结果除以100是不是就可以等到我们想要的数呢?

        double d1=10.01;
        double d2=10.00;
        System.out.println((d1*100-d2*100)/100);

这时候我们就可以得到我们想要的0.01了,可是我们不能每次计算dobulefloat的时候都把他们按倍数扩大再进行运算。 于是Java给我们提供了BigInteger和BigDecimal。从名字就能看出来BigInteger是来处理int整数类型的, 那么我们通过BigDecimal来进行刚刚的运算

        BigDecimal bd1=new BigDecimal(10.01);
        BigDecimal bd2=new BigDecimal(10.00);
        System.out.println(bd1.subtract(bd2));

结果居然还是错的,不过这次更精确了,0.0099999999999997868371792719699442386627197265625。为什么会这样呢?其实是因为十进制的小数在转换成二进制浮点数会产生精度问题,部分小数只是近似的表示,2进制表示不完全准确。所以这里不能用double或者float。应该换成String

        BigDecimal bd1=new BigDecimal("10.01");
        BigDecimal bd2=new BigDecimal("10.00");
        System.out.println(bd1.subtract(bd2));

这次结果终于对了。

不过BigDecimal原理可不是把小数扩大进行运算,把结果缩小返回的噢。