2010-12-23 89 views
4

下面的示例給出了一個解釋FLOAT如何在mySQL中工作的解釋嗎?我知道浮球是近似的,但真的,這樣的差異?而且只有9位數字,所以它不是溢出問題,不是嗎?mysql中的浮點精度問題

mysql> create table t(f FLOAT(15,2), db DOUBLE); 
mysql> insert into t(f,db) VALUES (512659663, 512659663); 
mysql> select * from t; 

+--------------+-----------+ 
| f   | db  | 
+--------------+-----------+ 
| 512659648.00 | 512659663 | 
+--------------+-----------+ 

(MySQL的版本14.14 DISTRIB 44年5月1日,爲Win32(IA32)在Windows XP)

回答

13

FLOAT是一個32位型,顧名思義,它是浮點型。值越高,絕對精度越低。

512659648足夠大,可以引入數十個錯誤。

Update:

IEEE-754(這就是FLOAT是),將數據存儲在32位:1位籤,8位二進制指數和23位有效數字。

指數顯示2(您的案例中的28268435456)最接近的最小功率。

有效數是一個二進制小數。它可以存儲從12的數字,精度可高達2^-23。在你的情況下,它是1.11101000111010010000110~ 1.9098060的十進制表示法。

該數字計算爲指數和有效數的乘積。

考慮到所有這些,該訂單的號碼(2^282^29)的精度爲2^(28 - 23) = 2^5 = 32

+0

是否可以估計近似誤差?它取決於數字的大小,還是還有別的? – 2010-12-23 16:49:55

+0

@ts:32位IEEE 754浮點數可以保存約7位精度的十進制數字; 64位的可以保存16位十進制數字。任何超過7位的數字都會遇到問題。 FLOAT(15,2)限定符比有效的更爲一廂情願; (15,2)基本上被忽略。 – 2010-12-23 17:03:23

1

單精度浮點數的尾數是22位長。因此它不能準確地存儲大於2^22的整數,4194304.