mysql中的float精度问题

时间:2010-12-23 16:31:56

标签: mysql types floating-point double

下面举例说明,任何人都可以向我解释FLOAT如何在mySQL中运行吗?我知道漂浮是近似的,但真的,这样的差异?并且只有9位数,所以它不是溢出问题,不是吗?

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 Ver 14.14 Distrib 5.1.44,适用于Windows XP上的Win32(ia32))

3 个答案:

答案 0 :(得分:13)

FLOAT32 - 位类型,顾名思义,浮点数。值越高,绝对精度越小。

512659648足以引入数十个错误。

Update:

IEEE-754中(这就是FLOAT),数据存储在32位:1 - 位符号,8 - 位二进制指数和23 - 有效位数。

指数显示最接近2的最小功效(28,或268435456)。

有效数是二元分数。它可以存储从12的数字,精度最高为2^-23。在您的情况下,它是1.11101000111010010000110~ 1.9098060十进制表示法。

该数字是指数和有效数的乘积。

鉴于这一切,该订单的数量(2 ^ (28 - 23) = 2 ^ 5 = 322^28)的精确度为2^29

答案 1 :(得分:1)

实际上,在MySQL中,FLOAT和DOUBLE都是近似浮点数。 MySQL uses four bytes for single-precision values and eight bytes for double-precision values.

所以,两列都是近似的 - 只是你的FLOAT列只有4个字节来试图估算你的数字。

答案 2 :(得分:1)

单精度浮点数的尾数长度为22位。因此,它无法准确存储大于2 ^ 22,4194304的整数。