【问题标题】:Integer division in sql serversql server中的整数除法
【发布时间】:2010-08-09 19:56:23
【问题描述】:

在 Microsoft SQL Server 2005 中,为什么以下命令会产生整数结果?

SELECT cast(151/6 AS DECIMAL(9,2))
SELECT 151/6

【问题讨论】:

标签: sql-server-2005


【解决方案1】:

首先,您得到两个整数的结果,然后将结果转换为 DECIMAL(9,2)。在第二个中,您只是将两个整数相除,这是意料之中的。

如果你将其中一个整数转换为小数你进行除法,你会得到一个小数结果。

SELECT 151/CAST(6 AS DECIMAL (9,2))

【讨论】:

  • 这件事浪费了我 5 个小时。
【解决方案2】:

不能直接回答您的问题。如果您在SSRS中需要这个,仍然值得看看Operators in Expressions

/ 将两个数字相除并返回一个浮点结果。

\ 将两个数字相除并返回一个整数结果。

Mod 返回除法的整数余数。

【讨论】:

    【解决方案3】:

    是的,这是标准行为

    SELECT 151/6.0
    

    SELECT 151/(CONVERT(DECIMAL(9,2),6))
    

    SELECT 151/(6 * 1.0)
    

    【讨论】:

      【解决方案4】:

      您还需要为小数位指定一个占位符

      示例

      SELECT 151.000000/6
      OR
      SELECT 151/6.000000
      

      两者都会产生

      25.16666666

      【讨论】:

        【解决方案5】:

        因为 151 和 6 是整数,而且您正在进行整数除法,甚至在强制转换之前。

        您需要确保至少有一个参数是浮点类型:

        SELECT 151.0/6
        

        或者

        SELECT 151/6.0
        

        【讨论】:

        • 感谢奥德。它总是一些东西。
        【解决方案6】:

        试试这个:

        SELECT 1.0*cast(151/6 AS DECIMAL(9,2))
        SELECT 1.0*151/6
        

        【讨论】:

          【解决方案7】:

          出于与 C#、Java 和其他主流语言相同的原因。

          在整数算术中,CAST 在数学之后...

          【讨论】:

            【解决方案8】:

            CAST 语句有点冗长。您可以改用以下内容:

            DECLARE @TO_FLOAT FLOAT = 1.0;
            SELECT (1 * @TO_FLOAT) / 2;
            

            如果您愿意,也可以使用不同的乘数类型,例如 DECIMAL。

            【讨论】:

            • Floatdecimal 不同。例如,可以将浮点文字指定为 1e0
            猜你喜欢
            • 1970-01-01
            • 2020-08-01
            • 2014-12-05
            • 1970-01-01
            • 2018-07-06
            • 2021-03-16
            • 2016-08-16
            • 2023-03-07
            • 1970-01-01
            相关资源
            最近更新 更多