下面举例说明,任何人都可以向我解释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))
答案 0 :(得分:13)
FLOAT
是32
- 位类型,顾名思义,浮点数。值越高,绝对精度越小。
512659648
足以引入数十个错误。
Update:
在IEEE-754
中(这就是FLOAT
),数据存储在32
位:1
- 位符号,8
- 位二进制指数和23
- 有效位数。
指数显示最接近2
的最小功效(28
,或268435456
)。
有效数是二元分数。它可以存储从1
到2
的数字,精度最高为2^-23
。在您的情况下,它是1.11101000111010010000110
或~ 1.9098060
十进制表示法。
该数字是指数和有效数的乘积。
鉴于这一切,该订单的数量(2 ^ (28 - 23) = 2 ^ 5 = 32
到2^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的整数。