Java 与 MySQL:浮点类型差异

Java vs MySQL: float type difference

提问人:mark 提问时间:9/1/2013 最后编辑:O. Jonesmark 更新时间:3/15/2017 访问量:1671

问:

我在 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 的精度正常工作?

java mysql 浮点 精度 float-accuracy

评论


答:

3赞 O. Jones 9/1/2013 #1

您正在突破 32 位 IEEE 754 维基百科浮点精度的极限。它具有大约 24 位的精度。通常的经验法则是,可用的最小增量值约为要递增的数字值的 1 / 10**7。

261.1200 和 261.1201 在精度级别上存储在 中,是相同的值。这个 SQL Fiddle 演示了这一事实。http://sqlfiddle.com/#!2/2a521/2/0FLOAT

所有和数字都是近似值。floatdouble

http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html

http://introcs.cs.princeton.edu/java/91float/

当两个浮点值彼此不相等时,即使您认为它们应该相等,也就不足为奇了。当他们出现时,总是令人惊讶。==

评论

0赞 mark 9/1/2013
是的,我正在推动它们,因为我面临着不应该包含在项目中的数字。我仍然不需要完全的精度,但我想提前知道问题有多严重......反正标准是一样的,我真的无法理解那种区别。你说这很正常,但是什么原因?
0赞 O. Jones 9/1/2013
看看我的编辑,还有这个sqlfiddle。sqlfiddle.com/#!2/2a521/2/0要了解这里发生的事情,请阅读我引用的普林斯顿参考资料。
0赞 Winter 11/1/2018
不提供任何以相同方式存储 sql 和 java 浮点的解决方案
2赞 Binod Suman 3/19/2015 #2

我知道这是非常古老的讨论线程,但今天我解决了同样的问题,并想与大家分享。

在数据库端,其中一列是浮点数,我使用

call = (CallableStatement)this.getStatement();
call.setFloat(floatData)

但是当我尝试保存一些浮点值时,正确的数据不会保存在数据库中,并且它是如何转换为不同的十进制值的。

溶液:

然后我将floatData转换为dobule值并调用

call.setDouble(doubledata)

即使数据库列是浮点型。

现在它工作正常。