2015-05-19 38 views
0

我有一個列設置爲FLOAT(32,11),我得到一些奇怪的結果與存儲值。現在我知道浮點數只是一個近似值,但是這似乎是一個可怕的近似值,尤其是對於給定的精度。MySQL浮點近似和精度

mysql> CREATE TABLE test (a FLOAT(32,11)); 
mysql> INSERT INTO test (a) VALUES (300000.08); 
mysql> SELECT * FROM test; 
+--------------------+ 
| a     | 
+--------------------+ 
| 300000.09375000000 | 
+--------------------+ 
1 row in set (0.00 sec) 

似乎很奇怪,它沒有使用所有可用的精度。關於我失蹤的任何想法?

MySQL版本73年1月5日在CentOS

+0

您可能正在運行存儲限制。如果你插入'30,000.08'(小10倍),你會得到'30,000.08007812500'。 –

+0

@sajad:整數 –

+0

@Sajad請不要劫持別人的問題! –

回答

2

FLOATsingle-precision floating point。這隻有24位尾數。這不足以準確地保存8位十進制數字,所以在最低位數字中出現錯誤。

如果您使用DOUBLE而不是FLOAT,則會得到更準確的結果。

mysql> CREATE TABLE test (a DOUBLE(32,11));  
mysql> INSERT INTO test (a) VALUES (300000.08);  
mysql> select * from test; 
+--------------------+ 
| a     | 
+--------------------+ 
| 300000.08000000002 | 
+--------------------+ 
0

我不知道爲什麼會產生的精度損失,但是,從reference manual報價:

因爲浮點值是近似的,而不是作爲精確值存儲,嘗試將它們作爲比較準確對待可能會導致問題。他們也受到平臺或實施依賴關係的影響。

所以,我建議你另一種方法是:使用DECIMAL代替FLOAT(或DOUBLE)執行precission