【问题标题】:SQL Division precisionSQL除法精度
【发布时间】:2018-01-29 20:15:00
【问题描述】:

我有 2 列需要除以 sum(cola)/sum(ColB),但我没有得到想要的结果,因为 SQL Server 似乎截断了小数点后的值 例如。我有-

select 281370/1035

使用简单除法给出 271,而除法的实际结果是 271.8550724637681,我想显示 271.8

我试过了

SELECT cast(round(281370/1035,1) as numeric(36,1))

但结果271.0

【问题讨论】:

  • colAcolB 是从哪些类型开始的?试试SELECT 281370.0/1035.0。 (添加假小数通常会强制进行非整数计算)
  • 嗯,它们不是小数位。他们真的是零。
  • 两个数字都被视为整数,所以它使用整数除法。当您使用强制转换时,您将它用于整数除法的结果。您需要先转换分子或分母(或者您可以使用执行隐式转换的2081370*1.0/1035
  • @ThorstenKettner 如果我没记错的话,postgres 也有同样的行为
  • 还有其他 dbms 也在做整数除法。如果你习惯了它会很方便!

标签: sql sql-server rounding division


【解决方案1】:

在 SQL Server 中,您必须将整数转换为十进制,并且可以使用 Round 来获得所需的精度。

SELECT cast(Round(CAST(281370 AS decimal) / CAST(1035 AS decimal),1,1) as decimal(10,1))

【讨论】:

    【解决方案2】:

    问题是你给了 int 数字并且想要一个小数结果

    试试这个

    select convert(decimal(30,10),281370.0/1035.0)
    

    select Round(convert(decimal(30,10),281370.0/1035.0),1,1)
    

    【讨论】:

      【解决方案3】:

      @Stormcloak 给出了特别想要一个位置作为尾数的答案,但是要返回一个确切的答案,您可以“简单地”隐式更改数据类型。

      select 281370.0/1035
      

      返回:

      271.855072
      

      【讨论】:

      • 让我们明确一点:281370.0/1035 = 271.855072 无论如何都不准确。它肯定比 271 更接近,但即使使用浮点类型也会丢失很多精度。
      【解决方案4】:

      在 Presto DB 中: 选择 (CAST(11 as decimal(8,6))/CAST(7 as decimal(8,6))) 作为结果

      结果:1​​.571429

      十进制(xp,xs)

      • xp--> 总位数(小数点前+小数点后 点)
      • xs-->小数点后的位数

      参考:https://prestodb.io/docs/current/functions/decimal.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多