计算精度有关问题 - 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);的构造方法。