BigDecimal math1 = new BigDecimal(10000000.12); BigDecimal math2 = new BigDecimal(20000000.23);

System.out.println(math1);

System.out.println(math2); System.out.println(math1.add(math2));公司是做金融项目的,大额数字不应该用double类型,但是用BigDecimal却出现了这样的结果:10000000.11999999918043613433837890625
20000000.2300000004470348358154296875
30000000.34999999962747097015380859375为什么?该如何用?

解决方案 »

  1.   

    BigDecimal math1 = new BigDecimal("10000000.12"); BigDecimal math2 = new BigDecimal("20000000.23"); 这样就没问题,你传入的是浮点类型,浮点本来就不精确,所以会出现这种情况。
      

  2.   

    楼上的是对的,用String来构造BigDecimal
      

  3.   


    MathContext mc = new MathContext(10);
    BigDecimal math1 = new BigDecimal(10000000.12,mc); 
    System.out.println(math1);
    //MathContext设置指定的精度,也就是出现的数字的个数,此方法仅限于小数点以前固定长度的,不是很好
    建议用2楼的方法,用字符串形式的
      

  4.   

    BigDecimal 构造时,必须传String参数,否则和平常的计算一样。
      

  5.   

    在《Effective Java》这本书中也提到这个原则,
    float和double只能用来做科学计算或者是工程计算,
    在商业计算中我们要用java.math.BigDecimal。