【问题标题】:Why MYSQL SUM() on FLOAT columns generates fractions为什么 FLOAT 列上的 MYSQL SUM() 会生成分数
【发布时间】:2018-06-05 17:12:07
【问题描述】:

有人能告诉我为什么在 FLOAT 列上执行 MySQL SUM() 函数会产生奇怪的结果吗?

例子:

CREATE TABLE payments (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    amount FLOAT DEFAULT NULL,
    PRIMARY KEY(id)
);

INSERT INTO payments (amount) VALUES (1.3),(1.43),(1.65),(1.71);

执行 SUM() 时,期望 6.09,MySQL 返回该浮点数:

mysql> SELECT SUM(amount) FROM payments WHERE 1;
+--------------------+
| SUM(amount)        |
+--------------------+
| 6.0899999141693115 |
+--------------------+
1 row in set (0.00 sec)

这对于一个可能会开发的人来说是相当可怕的,比如说……会计软件! :/

版本:Mysql 5.5.60

【问题讨论】:

标签: mysql precision accounting


【解决方案1】:

这就是为什么在舍入很重要的任何地方都不要使用浮点值的原因。甚至manual 说:

DECIMAL 和 NUMERIC 类型存储精确的数字数据值。当需要保持精确的精度时使用这些类型,例如货币数据。

【讨论】:

  • 好的,在使用 FLOAT 列之前我没有检查 mysql 文档。知道是非常有用的!那么什么时候使用 FLOAT 列?它可以最大限度地提高精度不重要的值的存储或计算速度?
  • @Simmoniz 它不仅仅是一个 mysql 的东西,它是一个通用的计算的东西。是的,“浮点”数学往往比“十进制”数学快得多,但十进制数学存储精确值,因此可以管理具有此类副作用的基本加法、减法和乘法......尽管据我所知仍然可以有计算问题,例如 1/3。
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2013-03-03
  • 1970-01-01
  • 2015-03-14
相关资源
最近更新 更多