【转】Java 小数类型运算·坑·

转自
一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾。

BigDecimal类位于java.maths类包下。
首先我们来看下如何构造一个BigDecimal对象。它的构造函数很多,我挑最常用的两个来演示一下:
一个就是BigDecimal(double val),另一个就是BigDecimal(String str)。

下面是两个浮点数相减的例子来说明:

    public static void main(String[] args) {
        double a = 1;
        double b = 0.9;

        //推荐做法:把double转成String
        BigDecimal a1 = new BigDecimal(Double.toString(a));
        BigDecimal b1 = new BigDecimal(Double.toString(b));
        double c = a1.subtract(b1).doubleValue();
        System.out.println("c=" + c);

        //不推荐做法:直接传入double
        BigDecimal a2 = new BigDecimal(a);
        BigDecimal b2 = new BigDecimal(b);
        double d = a2.subtract(b2).doubleValue();
        System.out.println("d=" + d);
    }

结果为:

c=0.1
d=0.09999999999999998

结论:

  1. 利用double类型作为参数的构造函数,不能精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。
  2. 利用String类型作为参数的构造函数,能精确的构造出一个BigDecimal对象。

你可能感兴趣的:(【转】Java 小数类型运算·坑·)