2009-05-22 80 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。