MySQL浮点近似和精度

时间:2015-05-19 20:51:59

标签: mysql

我已将列设置为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

2 个答案:

答案 0 :(得分:2)

FLOATsingle-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)来强制执行