从 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 中提取了其他值,例如 integer
和 varchar
,它们正在转换为所需类型的 integer
和 string
在 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。
所以我试图读取一些从 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 中提取了其他值,例如 integer
和 varchar
,它们正在转换为所需类型的 integer
和 string
在 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。