从 mysql 返回到 java 的双精度值不正确

Incorrect double values returned from mysql to java

所以我试图读取一些从 mysql 到 java 的双精度值。 我正在使用 mybatis 映射器来读取我的值和 return 作为映射的值。

当我 运行 我在 sql 中的查询时,我的值是 -42295.8451869851 但是当我使用 mybatis 从查询中选择相同的值并将其放入 java Hashmap 的值变为 {Double@25327}-42295.84518699004 。为什么会出现这种异常情况,我该如何预防?

这是我正在使用的mybatis查询行: 我正在使用 class org.apache.ibatis.session.SqlSession;

List<Map<String, Object>> myListMaps =  getSqlSession().selectList(QUERY_NAME, queryParameters);

编辑:看了几个回复后,我意识到我需要以某种方式使用 bigDecimal 而不是 Double/Float。所以我会重新设计我的问题来解决我的目的。有没有办法告诉mybatis某个sql类型要映射到BigDecimal而不是HashMap中的Double/Float?

我还从 sql 中提取了其他值,例如 integervarchar,它们正在转换为所需类型的 integerstring 在 java 中,我希望它们按原样被选中。只需要将双精度更改为 bigdecimal。

对于浮点数,此行为是预期的。您可以阅读 IEEE 754 的工作原理 https://en.wikipedia.org/wiki/IEEE_754

但我认为还有另一个问题正在发生。你说这个数字是双精度(64 位),但根据结果看起来它被转换为浮点数(32 位)

-42295.8451869851 -> 0xC0E4A6FB0BC59380 (64bit) - 0xC72537D8 (32bit)

-42295.84518699004 -> 0xC0E4A6FB0BC59627 (64bit)- 0xC72537D8 (32bit)

如果您想保持精度正确,那么您需要在数据库中正确定义它,然后在 Java 中使用 https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html

如果需要精度,请使用 BigDecimal doc