提问人:mark 提问时间:9/1/2013 最后编辑:O. Jonesmark 更新时间:3/15/2017 访问量:1671
Java 与 MySQL:浮点类型差异
Java vs MySQL: float type difference
问:
我在 java 中使用浮点数,打印它们并将它们存储在 MySQL 浮点列中。结果是 java 打印如下所示 x=260.1201 y=260.12
没关系,因为 x=y+0.0001 当我尝试将这些值存储在 MySQL 上的拖曳浮点列中时,我可以在其中读取的值是 x=260.12 y=260.12
为什么会有这种差异?java 的 float 和 MySQL 的 float 不是一回事吗?
只是另一个问题:在哪个更大的值下,我可以期望使用 java float 以 0.0001 的精度正常工作?
答:
您正在突破 32 位 IEEE 754 维基百科浮点精度的极限。它具有大约 24 位的精度。通常的经验法则是,可用的最小增量值约为要递增的数字值的 1 / 10**7。
261.1200 和 261.1201 在精度级别上存储在 中,是相同的值。这个 SQL Fiddle 演示了这一事实。http://sqlfiddle.com/#!2/2a521/2/0FLOAT
所有和数字都是近似值。float
double
http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
http://introcs.cs.princeton.edu/java/91float/
当两个浮点值彼此不相等时,即使您认为它们应该相等,也就不足为奇了。当他们出现时,总是令人惊讶。==
评论
我知道这是非常古老的讨论线程,但今天我解决了同样的问题,并想与大家分享。
在数据库端,其中一列是浮点数,我使用
call = (CallableStatement)this.getStatement();
call.setFloat(floatData)
但是当我尝试保存一些浮点值时,正确的数据不会保存在数据库中,并且它是如何转换为不同的十进制值的。
溶液:
然后我将floatData转换为dobule值并调用
call.setDouble(doubledata)
即使数据库列是浮点型。
现在它工作正常。
评论