我已将列设置为FLOAT(32,11)
,并且我在存储值时获得了一些奇怪的结果。现在我知道浮点数只是一个近似值,但这似乎是一个可怕的近似值,特别是在给定的精度下。
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)
奇怪的是它并没有使用所有可用的精度。关于我失踪的任何想法?
CentOS上的MySQL版本5.1.73
答案 0 :(得分:2)
FLOAT
是single-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 |
+--------------------+
答案 1 :(得分:0)
我不知道为什么会产生精度损失,但引用reference manual:
由于浮点值是近似值而未存储为精确值,因此尝试在比较中将它们视为精确值可能会导致问题。它们还受平台或实现依赖性的影响。
所以,我建议您使用的替代方法是:使用DECIMAL
代替FLOAT
(或DOUBLE
)来强制执行