SQL Server:没有舍入问题的整数

时间:2016-05-06 13:42:53

标签: sql sql-server sql-server-2005

我在查询下面运行我期待值 300 (我在Excel中)。 我想在没有四舍五入的情况下获得价值300。

declare @a decimal(20, 10)

set @a = (1.00000 / 33.00000)

select @a

select @a * 9900 (0.0303030303 * 9900 = 300 in Excel).

在SQL Server中,结果为299.9999。我希望得到300而不用四舍五入。我正在使用SQL Server 2005。

3 个答案:

答案 0 :(得分:1)

正如其他人所指出的那样,Excel正在对数字进行四舍五入。要在SQL中舍入,可以使用几个函数:

  1. Round
  2. Ceiling
  3. Floor
  4. 天花板向上,向下,向下舍入到最近。使用round,您必须指定要舍入的小数位数。

    示例

    SELECT
        CEILING(1.5)    AS c,
        FLOOR(1.5)      AS f,   
        ROUND(1.5, 0)   AS r
    ;
    

    <强>返回

    c   f   r
    2   1   2.0
    

答案 1 :(得分:1)

在SQL Server中,精度的数字由分母决定。例如:

using System;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            string outputFormat = "out/pdf";
            var outputFormatEnum = outputFormat.ConverToEnum();
            var outputFormatEnumValueString = outputFormatEnum.ConvertToString();

            Console.WriteLine($"outputFormat: {outputFormat} | outputFormatEnumValueString: {outputFormatEnumValueString}");

            Console.ReadLine();
        }
    }
}

这将返回1.

SELECT 1/1

这将返回1.000000。

在这种情况下,由于除以33.00000,您的答案将具有小数精度。如果你愿意,我想你可以SELECT 1/1.0 你的结果。以下查询将为您提供预期的结果。

ROUND

正如其他用户所说,尽管Excel显示了SQL Server,但它正在给出正确答案。

答案 2 :(得分:0)

您可以使用强制转换或转换:

declare @a decimal(20,10) set @a=(1.00000/33.00000) select @a select CONVERT (INT, @a * 9900)

OR

declare @a decimal(20,10) set @a=(1.00000/33.00000) select @a select CAST(@a * 9900 AS INT)