【问题标题】:Dynamic ROUND() on DECIMAL() type doesn't truncate trailing decimal places - MySQLDECIMAL() 类型上的动态 ROUND() 不会截断尾随小数位 - MySQL
【发布时间】:2021-10-03 07:15:26
【问题描述】:

当函数的第二个参数本身是某个函数并且被舍入的值是 DECIMAL 类型时,MySQL ROUND() 函数会正确舍入一个值,但不会截断尾随零。

有人可以解释导致这种行为的原因吗?

下面的查询显示了四种情况:

  1. 静态回合,按预期工作
  2. 动态舍入,其中舍入的位数是通过 IF() 评估的,不会截断
  3. 动态舍入(通过 ROUND() 计算舍入的位数)不会截断
  4. 动态舍入,其中被舍入的值可以是不同的类型,按预期工作

示例查询:

SELECT
    ROUND(val1, 3),
    ROUND(val1, IF(val1 < 5, 3, 3)),
    ROUND(val1, ROUND(val1)),
    ROUND(IFNULL(val1, '--'), IF(val1 < 5, 3, 3)),
    val1
FROM table_one;

工作台输出here。 (没有要嵌入的积分,抱歉)

创建包含两个条目的示例表:

CREATE TABLE `table_one` (
  `val1` decimal(20,10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO table_one VALUES (6.123423), (3.678903);

【问题讨论】:

    标签: mysql decimal rounding truncate


    【解决方案1】:

    不得不承认我不确定IF 不起作用的原因,但确实如此。 c 结果列根据需要进行四舍五入。

    SELECT *, round(val1,3) as a,
        ROUND(val1, IF(val1 < 5, 3, 2)) as b,
        case when val1 < 5 then round(val1,3)
             when val1 > 6 then round(val1,2)
        end as c
    FROM test.table_one;
    

    结果

    val1            a       b               c
    6.1234230000    6.123   6.1200000000    6.12
    3.6789030000    3.679   3.6790000000    3.679
    

    【讨论】:

    • val1 &gt;= 5 AND val1 &lt;= 6 时会发生什么?
    • 谢谢。这确实有效 - 但希望可以避免!在我的实际查询中,“val1”的逻辑本身就相当复杂,因此尽可能避免重复。现在必须做。
    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 2020-01-15
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多