【问题标题】:Is there a ROUNDDOWN() function in sql as there is in EXCELsql 中是否有像 EXCEL 中一样的 ROUNDDOWN() 函数
【发布时间】:2020-05-07 14:55:31
【问题描述】:

假设我有一个表,它有两列,即数量和百分比,其中我的百分比是小数。现在我想将这两列相乘并将值四舍五入到小数点后两位。向下舍入意味着从 1 到 9 的所有数字都向下舍入。 SQL 中是否有像 Excel 中那样的内置函数?

例子:

13.567 should round to 13.56
136.7834 should round to 136.78
0.7699 should round to 0.76

我曾尝试在线搜索此类功能,但找不到合适的解决方案。

【问题讨论】:

  • all in the fantastic manual,值得一读。
  • @MuhammadWaheed 不是重复的,因为这个问题涉及小数点舍入,而不是整数。
  • 感谢@CoolBots 理解这个问题。通用 ROUND() 函数将 0-4 的值舍入为下面的一个值,将 5-9 的值舍入为上面的一个值。一般的 FLOOR() 函数给出一个不带小数的值。我想要的是说我的数字是 2.3456,它应该四舍五入到小数点后 3 位为 2.345 而不是 2.346。
  • 解决问题的方法是截断多余的小数,这可以通过使用ROUND函数的额外参数ROUND(number, decimal_places, 0/1)来实现。这里如果最后一个参数不是0,它将截断而不是四舍五入,这相当于我正在寻找的excel的ROUNDDOWN()函数。

标签: mysql sql database math


【解决方案1】:

有一个FLOOR 函数,可以适应您的用例:

SELECT FLOOR(value * 100) / 100 AS RoundedValue

【讨论】:

    【解决方案2】:

    您可以使用TRUNCATE () 进行此舍入

    select TRUNCATE(2.847, 2) as rounddown
    

    SELECT Floor(135.675); //for integer rounding, like 135
    

    你也可以使用

    select round(123.456, 2, 1) as rounddown
    

    第三个参数非零将导致在第二个参数中指定的小数点后截断。

    DB Fiddle

    https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/tpc/db2z_bif_truncate.html

    https://www.w3schools.com/sql/func_sqlserver_floor.asp

    【讨论】:

    • OP需要指定要向下舍入的小数位数;我不相信Floor 接受这样的参数
    • OP 在 MySQL 中寻找解决方案,而不是在 SqlServer 中。此外,该函数不会四舍五入到小数点后两位,正如您在小提琴中看到的那样
    • 在 mysql 8 中运行成功。 check it
    • @Shaikot 我用一些结果应该是什么例子编辑了这个问题。尝试使用这些值 - 任何 mySQL 版本 - 根据我的回答,如果没有额外的数学运算,Floor 不能用于完成此操作。
    • 你的答案也是错误的,我现在在 mysql 8 中检查它。当我回答这个问题时,它是不同的。感谢您的编辑并清除它。那么你可以使用 TRUNCATE()
    【解决方案3】:

    解决问题的方法是截断多余的小数,这可以通过使用 ROUND 函数的额外参数 ROUND(number, decimal_places, 0/1) 来实现。这里如果最后一个参数不是0,它将截断而不是四舍五入,这相当于我正在寻找的excel的ROUNDDOWN()函数。

    或者,您可以使用 TRUNCATE() 函数,传递要保留的小数位数作为第二个参数,这将删除任何多余的小数,充当 ROUNDDOWN() 函数。

    【讨论】:

      【解决方案4】:

      我希望这个舍入实用程序可以帮助某人:

      CREATE FUNCTION `get_round`(val DOUBLE, nDigits INT, RoundStyle VARCHAR(255)) RETURNS double
              NO SQL
          BEGIN
            DECLARE a DOUBLE DEFAULT 0;
            SET nDigits = ifnull(nDigits, 0);
      
          CASE
              WHEN UCASE(RoundStyle) IN ('ROUND NEAREST','', 'NEAREST', '', 'RND','ROUND', 'DEFAULT','DFLT', null) THEN #normal rounding, but up from 10.50#
                          SET a = round(val, nDigits); 
              WHEN UCASE(RoundStyle) IN('ROUND UP', 'UP') THEN #ROUND 10.554 to 10.56
                          SET a =  ceil(val * (power(10, nDigits) )) / (power(10, nDigits));
              WHEN UCASE(RoundStyle) IN('ROUND DOWN', 'DOWN') THEN #ROUND 10.555 to 10.55
                          SET a =  truncate(val, nDigits) ;                 
              WHEN UCASE(RoundStyle) IN('ROUND BANKER', 'BANKER','BANKERS ROUNDING') THEN #ROUND TO THE NEAREST EVEN 10.555 is 10.56 and 10.565 is 10.56
                          SET a = IF(ABS(val - TRUNCATE(val, nDigits)) * POWER(10, nDigits + 1) = 5 
                                  AND NOT CONVERT(TRUNCATE(ABS(val) * POWER(10, nDigits), 0), UNSIGNED) % 2 = 1,
                                  TRUNCATE(val, nDigits), ROUND(val, nDigits));
              WHEN UCASE(RoundStyle) IN('ROUND UP INTEGER', 'INT UP','UP INT') THEN #10.4 rounds to 11.0
                          SET a =  ceiling(val);
              WHEN UCASE(RoundStyle) IN('ROUND DOWN INTEGER', 'INT DOWN','DOWN INT') THEN #10.6 rounds to 10.0
                          SET a =  floor(val);
          END CASE;
      
          RETURN ifnull(a, 0);
          END
      

      【讨论】:

        【解决方案5】:

        是的,sql中有一些函数用于回合

        例如:

        SELECT ProductName, Price, FlOOR(Price) AS RoundedPrice
            FROM Products;
        

        【讨论】:

        • 尝试使用超链接而不是直接链接
        • 这不会向下,它只是四舍五入 - try it
        • 使用 0 instade of 2 check it
        • 你了解“向下取整”吗? 0 只是将它四舍五入到零小数点 - 试试ROUND(135.6, 0) - 你会得到什么? 136,对吧?不是 OP 所要求的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        • 2013-04-02
        • 2018-03-31
        • 2015-06-22
        • 2011-11-27
        • 1970-01-01
        相关资源
        最近更新 更多