Java下dobule转long精度丢失的问题

项目中的一个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());
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容