2010-12-23 88 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.