这篇文章主要介绍了注意Java中 new BigDecimal(double val) 的使用,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
前言:
今天下午跑单元测试报错,发现一个关于 new BigDecimal(double val) 的代码问题,总结下。
问题
业务代码:
/**
* 校验价格是否一致
*
* @param frontPrice 前端商品价格
* @param realPrice 商品系统价格
* @return boolean true 相等
*/
public static boolean comparePrice(BigDecimal frontPrice, BigDecimal realPrice) {
return frontPrice.compareTo(realPrice) == 0;
}
测试代码:
/**
* 前端价格
*/
BigDecimal forntPrice = new BigDecimal(0.2);
然后测试 comparePrice 方法总是返回 false,frontPrice 和 realPrice 明明是相等的, 都是0.2。
经过断点排查问题发现 frontPrice 的值不是 0.2,而是 0.200000000000000011102230246251565404236316680908203125 。
我靠,怎么出现这种情况,BigDecimal 不是精准运算的吗?
解决
查看相关文档:
简单翻一下:
将 double 类型转换成 BigDecimal 类型。
- 这个构造函数的结果在某种程度上是不可预测的。你可能会觉得
new BigDecimal(0.1)
会创建一个刚好等于 0.1 的 BigDecimal,但它实际上等于 0.1000000000000000055511151231257827021181583404541015625 。这是因为 0.1 不能被精确地表示为一个双精度数。 - String 构造函数是完全可预测的,
new BigDecimal("0.1")
会创建一个完全等于 0.1 的 BigDecimal,建议优先使用 String 构造函数。 - 如果必须使用 double 作为转换源时,可以使用
BigDecimal.valueOf(0.1)
,它返回的结果也是精确的。
总结
将 double 类型转换为 BigDecimal 类型的时候,不要使用new BigDecimal(0.1)
这个构造函数,应为它得到的结果是不精确的,
使用BigDecimal.valueOf(0.1)
或new BigDecimal("0.1")
。
使用 IDEA 编码的时候会给警告提示:
到此这篇关于注意Java中 new BigDecimal(double val) 的使用的文章就介绍到这了,更多相关Java new BigDecimal内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:注意Java中 new BigDecimal(double val) 的使用
- SpringBoot使用thymeleaf实现一个前端表格方法详解 2023-06-06
- 深入了解Spring的事务传播机制 2023-06-02
- Java中的日期时间处理及格式化处理 2023-04-18
- Springboot整合minio实现文件服务的教程详解 2022-12-03
- JSP 制作验证码的实例详解 2023-07-30
- 基于Java Agent的premain方式实现方法耗时监控问题 2023-06-17
- Java实现顺序表的操作详解 2023-05-19
- JSP页面间传值问题实例简析 2023-08-03
- Spring Security权限想要细化到按钮实现示例 2023-03-07
- ExecutorService Callable Future多线程返回结果原理解析 2023-06-01