Double vs. BigDecimal?

前端 未结 6 2443
梦谈多话
梦谈多话 2020-11-22 02:19

I have to calculate some floating point variables and my colleague suggest me to use BigDecimal instead of double since it will be more precise. Bu

6条回答
  •  暖寄归人
    2020-11-22 02:29

    If you are dealing with calculation, there are laws on how you should calculate and what precision you should use. If you fail that you will be doing something illegal. The only real reason is that the bit representation of decimal cases are not precise. As Basil simply put, an example is the best explanation. Just to complement his example, here's what happens:

    static void theDoubleProblem1() {
        double d1 = 0.3;
        double d2 = 0.2;
        System.out.println("Double:\t 0,3 - 0,2 = " + (d1 - d2));
    
        float f1 = 0.3f;
        float f2 = 0.2f;
        System.out.println("Float:\t 0,3 - 0,2 = " + (f1 - f2));
    
        BigDecimal bd1 = new BigDecimal("0.3");
        BigDecimal bd2 = new BigDecimal("0.2");
        System.out.println("BigDec:\t 0,3 - 0,2 = " + (bd1.subtract(bd2)));
    }
    

    Output:

    Double:  0,3 - 0,2 = 0.09999999999999998
    Float:   0,3 - 0,2 = 0.10000001
    BigDec:  0,3 - 0,2 = 0.1
    

    Also we have that:

    static void theDoubleProblem2() {
        double d1 = 10;
        double d2 = 3;
        System.out.println("Double:\t 10 / 3 = " + (d1 / d2));
    
        float f1 = 10f;
        float f2 = 3f;
        System.out.println("Float:\t 10 / 3 = " + (f1 / f2));
    
        // Exception! 
        BigDecimal bd3 = new BigDecimal("10");
        BigDecimal bd4 = new BigDecimal("3");
        System.out.println("BigDec:\t 10 / 3 = " + (bd3.divide(bd4)));
    }
    

    Gives us the output:

    Double:  10 / 3 = 3.3333333333333335
    Float:   10 / 3 = 3.3333333
    Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion
    

    But:

    static void theDoubleProblem2() {
        BigDecimal bd3 = new BigDecimal("10");
        BigDecimal bd4 = new BigDecimal("3");
        System.out.println("BigDec:\t 10 / 3 = " + (bd3.divide(bd4, 4, BigDecimal.ROUND_HALF_UP)));
    }
    

    Has the output:

    BigDec:  10 / 3 = 3.3333 
    

提交回复
热议问题