java - 关于double和bigdecimal的精度问题

标签 java mybatis bigdecimal

线上出现了一个奇怪的问题,但是离线无法重现。

具体问题如下:数据库中存储的值为107.4,类型为decimal,mybatis取值,mybatis配置的java类型为double

以下说明:

BigDecimal.valueOf (the value).multiply(BigDecimal.valueOf(100)).LongValue()

返回:

10739

本地测试,结果总是:

10740

如何解决?

最佳答案

如果该值被取为 double,则计算机中 107.4 的值将已经存在近似误差,因为浮点值是 2 的(负)幂的有限和。

现在存在舍入问题、fp-strict 等等,但最好消除原因,并使用 BigDecimal 而不是 double。请注意,new BigDecimal(107.4) 不会执行,只能执行 new BigDecimal("107.4") 或自行更正精度/比例。

double value = 107.4; // Might actually be more like 107.39999987.
BigDecimal x = new BigDecimal(value).setScale(1, BigDecimal.ROUND_HALF_UP);

其中比例尺 1 对应于数据库列定义。

关于java - 关于double和bigdecimal的精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743845/

相关文章:

java - 带有 Java Config 和 XML 映射器的 MyBatis-Spring

java - MyBatis 映射器类未在具有两个数据源的 Spring Boot 应用程序中注册

c++ - 为什么在财务计算中应该使用十进制 float ,但它有舍入误差

java - 如何修复此方法,将字符串中的数字转换为显示正确的小数位数?

java - hibernate + Swing

java - 删除字符串中第二次出现空格后的文本

java - SpringData JPA native 查询提供 java.sql 数据而不是 LocalDate

java - 打印二维矩阵中所有元素的组合

java - 无法通过 jconn4.jar/Sybase 驱动程序版本 7 和 Mybatis 框架更新 Sybase 数据库中的多条记录

java - 从 String 转换为 BigDecimal 以对货币进行数学计算