【问题标题】:MySQL Float Approximation and PrecisionMySQL浮点近似和精度
【发布时间】:2015-05-19 20:51:59
【问题描述】:

我有一个列设置为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

【问题讨论】:

  • 您可能在存储限制中运行。如果您插入 30,000.08(小 10 倍),您会得到 30,000.08007812500 退出。
  • @Sajad 请不要劫持别人的问题!
  • @LorenzMeyer 你说得对,对不起!

标签: mysql


【解决方案1】:

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 |
+--------------------+

【讨论】:

    【解决方案2】:

    我不知道为什么会产生精度损失,但是,引用reference manual

    由于浮点值是近似值,而不是存储为精确值,因此在比较中尝试将它们视为精确值可能会导致问题。它们还受制于平台或实现依赖项。

    所以,我建议您的替代方法是:使用DECIMAL 而不是FLOAT(或DOUBLE)来强制执行精确度

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 2018-02-23
      • 2012-06-25
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多