【问题标题】:Rounding off to two decimal places in SQL在 SQL 中四舍五入到小数点后两位
【发布时间】:2012-05-09 22:43:33
【问题描述】:

我需要将分钟转换为小时,四舍五入到小数点后两位。我还需要在小数点后最多显示两个数字。所以如果我有 650 分钟,那么小时应该是 10.83。

这是我目前所拥有的:

Select round(Minutes/60.0,2) from ....

但在这种情况下,如果我的分钟数是 630 - 小时数是 10.5000000。但我只希望它为 10.50(四舍五入后)。我如何做到这一点?

【问题讨论】:

标签: sql rounding


【解决方案1】:

您可以将结果转换为numeric(x,2)。在哪里x <= 38

select
    round(630/60.0,2),
    cast(round(630/60.0,2) as numeric(36,2))

返回

10.500000    10.50

【讨论】:

  • 奇怪。 SELECT ROUND(630/60.0, 2); 已经给了我10.50
  • @u07ch 当您已经在使用演员表时,使用 round() 的目的是什么?
  • @Ram 这个问题没有指定 sql server 引擎——这就是为什么我自己突出显示了 round v 演员。转换为数字不会在所有引擎中进行舍入,因此如果计算出的数字是 10.809,您将得到 10.80 而不是所需问题的 10.81。
  • cast(630/60.0 as numeric(36,2)) 是足够的10,50
  • in ms sql cast (150.755555 as numeric (16,2)); 给出150.76
【解决方案2】:

使用SQL Server 2012,可以使用内置的format function

SELECT FORMAT(Minutes/60.0, 'N2')

【讨论】:

  • 请注意,这也引入了千位分隔符,例如1,757.47
  • 使用 '0.00' 而不是 'N2' 给出两位小数,但也没有千位分隔符。
  • 似乎转换为字符串?这搞砸了订单。
  • @blissweb 应该不是问题,因为您可以在原始列上排序,而不是 Format 函数的输出。
【解决方案3】:

你可以使用:

select cast((630/60.0) as decimal(16,2))

在 SQL Server 中

【讨论】:

  • 至少在 DB2 上,这不会对结果进行四舍五入。
  • 这是一个大胆的声明。它是在什么上测试的?
  • decimal(16,2) 不限制小数位数为 2。
【解决方案4】:
Declare @number float = 35.44987665;
Select round(@number,2) 

【讨论】:

  • 考虑为你的答案添加一点解释。
  • 如果是十进制 (10,6) 会发生什么?
  • 在 MS SQL Server 中,这将产生问题的确切问题。输出将是 35.44000000
【解决方案5】:
CAST(QuantityLevel AS NUMERIC(18,2))

【讨论】:

  • 欢迎来到 Stack Overflow!感谢您提供代码 sn-p,它可能会提供一些有限的即时帮助。通过描述为什么这是解决问题的好方法,正确的解释将极大地改进其long-term value,并使其对有其他类似问题的未来读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
  • 很好,这应该是迄今为止最好的答案之一。为什么我这么说...
【解决方案6】:
DECLARE @porcentaje FLOAT

SET @porcentaje = (CONVERT(DECIMAL,ABS(8700)) * 100) / CONVERT(DECIMAL,ABS(37020))

SELECT @porcentaje

【讨论】:

    【解决方案7】:

    试试这个:

        SELECT CAST(ROUND([Amount 1]/60,2) AS DECIMAL(10,2)) as TOTAL
    

    【讨论】:

      【解决方案8】:

      将您的号码转换为NumericDecimal

      将您的查询替换为以下内容。

      SQL Server

      Select Convert(Numeric(38, 2), Minutes/60.0) from ....
      

      MySQL:

      Select Convert(Minutes/60.0, Decimal(65, 2)) from ....
      

      Cast 函数是Convert 函数的包装器。再加上 SQL 是一种解释性语言,结果是即使这两个函数产生相同的结果,Cast 函数的幕后工作也稍微多一些。

      使用Convert 函数可以节省一些费用,但节省的费用会成倍增加。 parameters for Numeric and Decimal (38, 2) 和 (65, 2) 表示要使用的最大精度级别和小数位。

      【讨论】:

      • 感谢您作为唯一提供SQL Server和MySQL解决方案的人,并提供解释
      【解决方案9】:

      这适用于 PostgreSQL 和 Oracle:

      SELECT ename, sal, round(((sal * .15 + comm) /12),2)
      FROM emp where job = 'SALESMAN'
      

      【讨论】:

        【解决方案10】:

        无论您在面额中使用什么,都应该是十进制。例如,1548/100 将给出15.00

        如果我们在示例中将100 替换为100.0,那么我们将得到15.48

        select 1548/100
        15.00000
        
        select 1548/100.0
        15.4800
        
        0
        

        【讨论】:

        • Re "in denomination":你的意思是 "in the denominator"
        【解决方案11】:

        以下查询有用且简单-

        declare @floatExchRate float;
        set @floatExchRate=(select convert(decimal(10, 2), 0.2548712))
        select  @floatExchRate
        

        输出为 0.25。

        【讨论】:

        • 它是在什么上测试的?
        • @Peter Mortensen,在 MS SQL SERVER 上
        【解决方案12】:

        作为以下答案的补充,当您在公式中使用 INT 或非小数数据类型时,请记住将该值乘以 1 和您喜欢的小数位数。

        即- TotalPackagesINT,分母 TotalContainers 也是,但我希望我的结果最多保留六位小数。

        因此:

        ((m.TotalPackages * 1.000000) / m.TotalContainers) AS Packages,
        

        【讨论】:

          【解决方案13】:

          以下 sn-p 可能会对您有所帮助:

          select SUBSTR(ENDDTTM,1, 9), extract(DAY FROM (ENDDTTM)), ENDDTTM, BEGINDTTM,  (ENDDTTM - BEGINDTTM),substr(BEGINDTTM, 1,15), substr((ENDDTTM - BEGINDTTM), 12, 8),
          round((substr((ENDDTTM - BEGINDTTM), 12, 2)* 3600 + substr((ENDDTTM - BEGINDTTM), 15, 2)*60 +  substr((ENDDTTM - BEGINDTTM), 18, 2)),2) as seconds,
          round((substr((ENDDTTM - BEGINDTTM), 12, 2)* 60 + substr((ENDDTTM - BEGINDTTM), 15, 2) +  substr((ENDDTTM - BEGINDTTM), 18, 2)/60 ), 2)as minutes,
          round((substr((ENDDTTM - BEGINDTTM), 12, 2) + substr((ENDDTTM - BEGINDTTM), 15, 2)/60 +  substr((ENDDTTM - BEGINDTTM), 18, 2)/3600 ),2)  as hours
          

          【讨论】:

            【解决方案14】:

            我发现 STR 函数是完成此任务的最简洁方法。

            SELECT STR(ceiling(123.415432875), 6, 2)
            

            【讨论】:

            • 不会将这个上限四舍五入到 124 吗?
            【解决方案15】:

            四舍五入到x个小数位:

            SET @Result = CEILING(@Value * POWER(10, @Decimals)) / POWER(10, @Decimals)
            

            其中 @Value 是要四舍五入的项目的值,@Decimals 是小数位数,例如在本例中为两位。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-02
              • 1970-01-01
              • 1970-01-01
              • 2017-03-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多