【问题标题】:SQL rounding to decimal placesSQL 舍入到小数位
【发布时间】:2017-09-13 15:11:31
【问题描述】:

我有一个数据集,我需要计算价格并舍入到小数位。但结果并不完全符合预期。计算在case语句中

CREATE TABLE #Temp ( ID INT IDENTITY(1,1), Price DECIMAL(7,2) )

INSERT INTO #TEMP ( Price )
VALUES ( 119.99 )
        , ( 48.99 )

SELECT
    ID
    , Price
    , CASE WHEN Price > 10 THEN CONVERT( DECIMAL(7,2), Price * 1.08 - 0.05 ) END AS RRP
FROM #Temp

DROP TABLE #Temp

结果

ID  Price   RRP
1   119.99  129.54
2   48.99   52.86

如果可以与另一个数据集匹配,我需要在同一 case 语句中获取 129.54 到 129.55 和 52.86 到 52.85

【问题讨论】:

  • (119.99 * 1.08) - 0.05 = 129.5392,所以 1.54 是正确的。此外,ID 2 为 52.8592。你需要 129.55 和 52.85 的逻辑是什么?
  • round(price*1.08-0.05,2) 转换前。否则转换只会截断。 THEN CONVERT( DECIMAL(7,2), round(price*1.08-0.05,2))
  • PEMDAS 问题?以错误的顺序混合乘法和加法/减法可能会产生不同的结果 - 请查看此链接:en.wikipedia.org/wiki/Order_of_operations
  • @Eli 我不认为这是 PEMDAS。如果他打算先进行减法运算,那么第一个结果将是 123.59。
  • @xQbert:可能四舍五入到下一个5

标签: sql sql-server rounding


【解决方案1】:

您是否因为您的国家/地区已经摆脱了便士而四舍五入到最接近的 5 美分?这是我们似乎可以按照您的预期结果遵循的唯一逻辑。

SELECT ID
    ,Price
    ,CASE 
        WHEN Price > 10
            THEN ROUND(CONVERT(DECIMAL(7, 2), Price * 1.08 - 0.05) * 20, 0) / 20
        END AS RRP
FROM #Temp

【讨论】:

  • 我不认为我以前见过这样删除 cmets。
  • @xQbert 我也没有。我想我们惹恼了某人。我们会为此获得徽章吗?
【解决方案2】:

假设您要四舍五入到最接近的 5 美分或小数点后 100 位最接近的 5。

INSERT INTO #TEMP ( Price )
VALUES ( 119.99 )
        , ( 48.99 )

SELECT
    ID
    , Price
    , Price * 1.08 - 0.05
    , CASE WHEN Price > 10 THEN CONVERT( DECIMAL(7,2), round((Price * 1.08 - 0.05)*20,0)/20) END AS RRP
FROM #Temp

演示:http://rextester.com/QIM12944

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2010-11-21
    相关资源
    最近更新 更多