为什么MySQL浮动与Java浮动不同?

时间:2017-09-15 21:55:30

标签: java mysql floating-point

我在MySQL浮点列中插入一个浮点值1223473,当我将其返回时,该值更改为1223470。

 Input: 1223473.0 (0x49955988)

Output: 1223470.0 (0x49955970)
   AVG: 1223473.0 (0x49955988)
   MIN: 1223473.0 (0x49955988)
   MAX: 1223473.0 (0x49955988)
    +0: 1223473.0 (0x49955988)
    *1: 1223473.0 (0x49955988)
  CAST: 1223473.0 (0x49955988)

这是输出:

System.out.println(1223473f == 1223470f);  // gives false
System.out.println(123456789f == 123456791f);  // gives true (too many digits)

使用MySQL客户端可以看到相同的行为。

我无法解释为什么输入值与输出不同。而且,为什么申请手术会给出正确的价值呢?即使有其他值,我也会得到相同的行为。例如,如果我使用1223472而不是122473,则输出值将为1223470.它看起来像精度损失。但是为什么在它上面应用一个操作会准确地返回输入值?看起来MySQL的存储精度比它显示的更精确。

对于人们试图在浮动中放置太多数字的浮点类型,这看起来不像是典型的误解:

mysql> create table ttt (value float);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO ttt VALUES (1223473);
Query OK, 1 row affected (0.00 sec)

mysql> select * from ttt;
+---------+
| value   |
+---------+
| 1223470 |
+---------+
1 row in set (0.00 sec)

mysql> SELECT * FROM ttt WHERE value = 1223470;
Empty set (0.00 sec)

mysql> SELECT * FROM ttt WHERE value = 1223473;
+---------+
| value   |
+---------+
| 1223470 |
+---------+
1 row in set (0.00 sec)

最后,我不知道该怎么想......

$squery = "SELECT * FROM vesti";
$rsquery = mysqli_query($db,$squery);

while($svevesti = mysqli_fetch_asssoc($rsquery){

    // action here
}

为什么价值会发生变化?

1 个答案:

答案 0 :(得分:1)

您使用float作为数据类型。您没有足够的精度来表示1223473.0。浮点数也受制于平台或实现依赖性"根据{{​​3}}。

将列上的数据类型更改为double(或decimal),这样可以解决您的问题。请参阅MySQL documentation进行确认。

在对floatdouble的值执行时,汇总this SQLFiddle值等函数。从文档中可以清楚地看出,但我强烈怀疑在使用MINMAX+ 0* 1时也是如此在数据类型中,可以"保存结果值"。

您应该知道浮点运算应该在SUM, AVG, return a double(即阈值)内进行,也可以按照MySQL文档的规定进行。