MySQL round()与sum()的工作方式不符

MySQL round()与sum()的工作方式不符,mysql,Mysql,我使用以下查询 select round(sum(quantity * calories)) as calories from tableName; 其中数量和热量为双倍,分别为1.00和110.50。我期望输出为111,但上面的查询却给了我110。但是如果我执行一个像下面这样的简单查询 select round (110.50); 它给我111作为输出。我经历了这些,并使用了如下查询: select round(sum(cast(quantity * calories as char)))

我使用以下查询

select round(sum(quantity * calories)) as calories
from tableName;
其中数量和热量为双倍,分别为1.00和110.50。我期望输出为111,但上面的查询却给了我110。但是如果我执行一个像下面这样的简单查询

select round (110.50);
它给我111作为输出。我经历了这些,并使用了如下查询:

select round(sum(cast(quantity * calories as char))) as calories
from tableName;
但这一个也不适用于我,给110作为输出。有人能告诉我如何获得理想的111输出吗?

试试看:

SELECT ROUND ( CAST ( SUM (quantity * calories) AS DECIMAL(10,4))) AS calories
FROM tableName;
试试看:


当您使用浮点数进行计算时,最好使用十进制(m,d)数据类型,而不是浮点/双精度,因为浮点和双精度都表示近似的数字数据值,并且在与计算一起使用时容易出现舍入错误

对于您的查询,您可以使用:

select round(cast(sum(quantity * calories) as decimal(8,1))) as calories
from tableName;

当您使用浮点数进行计算时,最好使用十进制(m,d)数据类型,而不是浮点/双精度,因为浮点和双精度都表示近似的数字数据值,并且在与计算一起使用时容易出现舍入错误

对于您的查询,您可以使用:

select round(cast(sum(quantity * calories) as decimal(8,1))) as calories
from tableName;

您可以通过先将参数强制转换为十进制来实现这一点。然后我们以十进制形式执行求和/舍入操作

SELECT round( sum( 
    CAST(quantity AS DECIMAL(10,4)) * 
    CAST(calories AS DECIMAL(10,4)) ) ) AS calories
FROM tableName;
样本

mysql> SELECT * FROM tableName;

+----+----------+----------+
| id | quantity | calories |
+----+----------+----------+
|  1 |        1 |    110.5 |
+----+----------+----------+
1 row in set (0,02 sec)

mysql> SELECT round( sum(
    ->     CAST(quantity AS DECIMAL(10,4)) *
    ->     CAST(calories AS DECIMAL(10,4)) ) ) AS calories
    -> FROM tableName;
+----------+
| calories |
+----------+
|      111 |
+----------+
1 row in set (0,00 sec)

mysql>
带小数点的样本2(10,2)


您可以通过先将参数强制转换为十进制来实现这一点。然后我们以十进制形式执行求和/舍入操作

SELECT round( sum( 
    CAST(quantity AS DECIMAL(10,4)) * 
    CAST(calories AS DECIMAL(10,4)) ) ) AS calories
FROM tableName;
样本

mysql> SELECT * FROM tableName;

+----+----------+----------+
| id | quantity | calories |
+----+----------+----------+
|  1 |        1 |    110.5 |
+----+----------+----------+
1 row in set (0,02 sec)

mysql> SELECT round( sum(
    ->     CAST(quantity AS DECIMAL(10,4)) *
    ->     CAST(calories AS DECIMAL(10,4)) ) ) AS calories
    -> FROM tableName;
+----------+
| calories |
+----------+
|      111 |
+----------+
1 row in set (0,00 sec)

mysql>
带小数点的样本2(10,2)



此查询是应用于单个记录还是整个表?你能给我们一些示例数据来显示这里的上下文吗?是的,我将它应用于一个记录。浮点算法在编程语言(包括MySQL)中是不精确的。我的猜测是,有轻微的变化,这是导致该轮下降,而不是上升。我不会为此而失眠;如果您有一个真实的表,并且遇到严重的舍入问题,请更新您的问题。此查询是应用于单个记录还是整个表?你能给我们一些示例数据来显示这里的上下文吗?是的,我将它应用于一个记录。浮点算法在编程语言(包括MySQL)中是不精确的。我的猜测是,有轻微的变化,这是导致该轮下降,而不是上升。我不会为此而失眠;如果你有一个真正的表,并且你遇到了严重的舍入问题,那么请更新你的问题。它给了我正确的输出,但是你能解释一下小数点(8,1)到底在做什么吗。从这里我们了解了小数点(M,D)。我认为这个解决方案很好。它给了我正确的输出,但是你能解释一下十进制数(8,1)到底在做什么吗。从中我们了解了十进制数(M,D)。我认为这个解决方案很好。它给了我想要的输出,但我有一个疑问。数量和卡路里的数据类型已经是十进制(10,2),为什么我们需要再次将其转换为十进制。请解释你写的:“数量和卡路里是双倍的”。现在你写它的十进制数(2,2)。十进制(2,2)无法存储您的值。压缩的“精确”定点数字。M是总位数(精度),D是小数点后的位数(刻度)。请参阅:。对不起,这是我这边的错误。数量和热量仅为双(10,2)型。你的回答与@slaakso提供的有点相似,只是演员人数不同。谢谢你的帮助。我在回答中添加了一个样本。它给了我想要的输出,但我有一个疑问。数量和卡路里的数据类型已经是十进制(10,2),为什么我们需要再次将其转换为十进制。请解释你写的:“数量和卡路里是双倍的”。现在你写它的十进制数(2,2)。十进制(2,2)无法存储您的值。压缩的“精确”定点数字。M是总位数(精度),D是小数点后的位数(刻度)。请参阅:。对不起,这是我这边的错误。数量和热量仅为双(10,2)型。您的回答与@slaakso提供的有点相似,只是演员人数不同。谢谢您的帮助。我在我的网站中添加了一个样本answer@karthi,请参阅已编辑的答案。应该这样做。(y) 这类似于@slaakso的解决方案。谢谢您的帮助。@karthi,请参考编辑后的答案。应该这样做。(y) 这类似于@slaakso的解决方案。谢谢你的帮助。