计算精度有关问题 - double和float

计算精度问题 - double和float

在进行数字计算的时候,会出现莫名的情况,比如:1-0.4=0.60000001。

 

看如下代码:

public static void main(String[] args) {
		System.out.println((1-0.8)*31.14*2);
		
		double a1 = 1;
		double b1 = 0.8;
		double c1 = 31.14;
		double d1 = 2;
		System.out.println((a1-b1)*c1*d1);
		
		float a2 = 1;
		float b2 = 0.8f;
		float c2 = 31.14f;
		float d2 = 2;
		System.out.println((a2-b2)*c2*d2);		
		
		BigDecimal a3 = new BigDecimal(1);
		BigDecimal b3 = new BigDecimal(0.8);
		BigDecimal c3 = new BigDecimal(31.14);
		BigDecimal d3 = new BigDecimal(2);
		System.out.println(a3.subtract(b3).multiply(c3).multiply(d3));
		
		BigDecimal a4 = new BigDecimal("1");
		BigDecimal b4 = new BigDecimal("0.8");
		BigDecimal c4 = new BigDecimal("31.14");
		BigDecimal d4 = new BigDecimal("2");
		System.out.println(a4.subtract(b4).multiply(c4).multiply(d4));
	}

输出结果:
12.455999999999998
12.455999999999998
12.455999
12.455999
12.45599999999999746158607649704203548831061993239289114937182190168130091478815302252769
12.456

 

从这个试例可以看出,在进行数字运算的时候,尽可能的用BigDecimal,并且使用new BigDecimal(String val);的构造方法。