项目中的一个bug,很简单的代码:
double a = 129.97;
System.out.println((long)(a*100));
double b =129.98;
System.out.println((long)(b*100));
打印的结果是
12997
12997
2个值一样,查了一下资料,原因是double的精度问题,129.98d实际的值是129.97999999999998,具体说明可参考文档.
我们可以直接打印*100的值看看
double a = 129.97;
System.out.println((a*100));
double b =129.98;
System.out.println((b*100));
打印的结果是
12997.0
12997.999999999998
要解决的办法就是利用BigDecimal提供精确的乘法运算:
double b =129.98;
BigDecimal d1 = BigDecimal.valueOf(b);
BigDecimal d2 = BigDecimal.valueOf(100d);
BigDecimal d3 = d1.multiply(d2);
System.out.print(d3.toBigInteger().longValue());