MySql FLOAT数据类型和超过7位数的问题

时间:2009-05-22 15:25:05

标签: mysql rounding mysql-5.0

我们在Ubuntu 9.04上使用MySql 5.0。完整版是:5.0.75-0ubuntu10

我创建了一个测试数据库。并在其中的测试表。我从insert语句中看到以下输出:

mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test value(858147.11);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM test;
+-----------+
| floaty    |
+-----------+
| 858147.12 | 
+-----------+
1 row in set (0.00 sec)

mySql中设置的比例/精度似乎有问题...或者我错过了什么?

更新:

找到我们插入的其中一个数字的边界,这里是代码:

mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test value(131071.01);
Query OK, 1 row affected (0.01 sec)

mysql> insert into test value(131072.01);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM test;
+-----------+
| floaty    |
+-----------+
| 131071.01 | 
| 131072.02 | 
+-----------+
2 rows in set (0.00 sec)

mysql> 

2 个答案:

答案 0 :(得分:9)

Face Palm !!!!

浮点数是32位数,存储为尾数和指数。我不是100%确定MySql如何分割存储,但以Java为例,他们将24位用于签名的尾数,8位用于指数(科学记数法)。这意味着FLOAT可以具有的最大值是+ 8388608 * 10 ^ 127,最小值是-8388608 * 10 ^ 127。这意味着只有7位有效数字,而我的FLOAT定义使用了8位。

我们将把所有这些8,2从FLOAT切换到DOUBLE。

答案 1 :(得分:1)

MySQL文档提到“MySQL在存储值时执行舍入”,我怀疑这是问题所在。我复制了您的问题,但将存储类型更改为DOUBLE:

CREATE TABLE test (val, DOUBLE);

,检索到的值与您提供的测试值相匹配。

我的建议是,使用DOUBLE或者DECIMAL。我尝试了相同的原始测试:

CREATE TABLE test (val, DECIMAL(8,2));

它检索了我给它的值:858147.11。