2009-05-22 87 views
4

我们在Ubuntu 9.04上使用MySql 5.0。完整版本是:5.0.75-0ubuntu10MySql FLOAT数据类型和多于7位数字的问题

我创建了一个测试数据库。和一个测试表。我看到下面的输出从一个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的设置有问题?还是我错过了什么?

UPDATE:

发现我们将其中一个号码的边界,这里是代码:

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> 
+0

我实际上在运行5.0.67 MySQL的Windows窗口上获得858147.13。 – itsmatt 2009-05-22 15:34:06

回答

9

脸棕榈!!!!

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

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

1

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

CREATE TABLE test (val, DOUBLE); 

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

我的建议,它的价值是使用DOUBLE或DECIMAL。我试着用同样的原始测试:

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

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