MYSQL 中的 COALESCE + SUM 计算不正确

COALESCE + SUM in MYSQL incorrectly calculating

我正在使用 COALESCE 和 SUM 来获取每张发票的付款总值。以下为相关数据

SELECT 
    COALESCE(SUM(p.payment_amount),0) as amount_paid 
FROM Payments as p 
WHERE p.invoice = '13923';

以下是与该问题相关的数据库信息

invoice   type    payment_amount
13923    Credit    51.19
13923    Check     592.93

问题是,发票上的应付总额为 644.12。当我手动将两个付款金额相加时,它等于 644.12,这是准确的付款。但是当我 运行 查询并查看结果时,显示 payment_amount = 644.1199999999999

有人了解它是如何提出这个问题的,或者看到我的代码有任何问题或更好的方法吗?

注意:我使用 COALESCE 的原因是有时有付款,有时没有。所以我需要的值要么是支付的总金额,要么如果在付款中找不到记录则为 0。此代码合并在一个较长的查询中,但尝试仅发布相关数据。

我相信使用 ROUND 函数会给您想要的结果

ROUND(COALESCE(SUM(p.payment_amount),0),2)

在评论中进一步讨论后,这将是我提出的解决方案

payment_amount 列更新为 DECIMAL(15,2) 数据类型

CREATE TABLE `Payments` (
  `payment_amount` decimal(15,2) DEFAULT NULL
);

INSERT INTO `Payments` (`payment_amount`) VALUES ('51.19');

INSERT INTO `Payments` (`payment_amount`) VALUES ('592.93');

SELECT SUM(payment_amount) FROM Payments;

输出 644.12

您可以使用 CAST 将 sim 转换为十进制,并且应该在 SUM 之前执行 COALESCE:

SELECT 
    SUM(
      CAST(COALESCE(p.payment_amount, 0) AS DECIMAL(12,2))
    ) as amount_paid 
FROM Payments as p 
WHERE p.invoice = '13923';