System.out.println(0.09 + 0.01);
System.out.println(1.0-0.32);
System.out.println(1.015 * 100);
System.out.println(1.301 / 100);
输出的结果是:
0.09999999999999999
0.6799999999999999
101.49999999999999
0.013009999999999999
但是
System.out.println(0.1);
System.out.println(0.64);
System.out.println(101.5);
System.out.println(0.01301);
输出的结果又不是。为什么呀?
如果不进行加减直接输出小数为什么不会变
见http://blog.csdn.net/xymyeah/article/details/1759943
浮点型数据不要用来桌精细运算,会有误差,原因是数的表示是用二进制表示,所有一个范围,并不能表示所有的数,如果表示不了,就只能选择一个最接近的数,误差就是
0.一大串01
浮点运算会有一些舍入误差。这就跟浮点数不能直接使用==判断相等的道理是一样的,例如判断一个变量x是否等于1.0,不能写成x==1.0
,而应该写成abs(x-1.0)<eps
double型数据进行数学运算,会出现精度问题。
可以通过BigDecimal来操作。
BigDecimal bd1 = new BigDecimal("0.09");
BigDecimal bd2 = new BigDecimal("0.01");
System.out.println("add:" + bd1.add(bd2));
System.out.println("-------------------");
BigDecimal bd3 = new BigDecimal("1.0");
BigDecimal bd4 = new BigDecimal("0.32");
System.out.println("subtract:" + bd3.subtract(bd4));
System.out.println("-------------------");
BigDecimal bd5 = new BigDecimal("1.015");
BigDecimal bd6 = new BigDecimal("100");
System.out.println("multiply:" + bd5.multiply(bd6));
System.out.println("-------------------");
BigDecimal bd7 = new BigDecimal("1.301");
BigDecimal bd8 = new BigDecimal("100");
System.out.println("divide:" + bd7.divide(bd8));