SQL Server计算会产生意外结果

时间:2014-07-31 07:28:33

标签: sql sql-server

我有一个非常奇怪的场景,我确信这是一个解释。

我试图计算一些东西,这里是值:

 SELECT 145.28/63 *(8 * 100) / 100 -- returns: 18.4482480000

问题是这不正确,如果我用Windows Calculator进行计算,那么它会返回一个更精确的值:

145,28 / 63 *(8 - 0 * 100)/ 100 = 18,44825396825397

我必须改变很多才能使它与SQL Server一起使用:

SELECT 145.28  * 100 * 8 / (100 * 63) --RETURNS: 18.4482539682539

为什么我需要更改SQL Server中的数字而不是Windows中的数字?

在Navision编程中,它返回正确的值,即18.4482539682539682

4 个答案:

答案 0 :(得分:8)

自动分配的默认数据类型根本不具备您想要的精度。通过将第一个数字显式地转换为更精确的数据类型,可以很容易地解决这个问题:

SELECT CAST(145.28 AS decimal(38,35))/63 *(8 * 100) / 100 
--returns 18.448253968253968253968253

从那里出来sql server明白不要向下转,所以结果变成了18.448253968253968253968253

十进制的语法是十进制(总位置,逗号后面)。不要忘记逗号占有一席之地。

这是纪录片的link

如果要限制小数,可以像这样使用ROUND:

SELECT ROUND(CAST(145.28 AS float)/63 *(8 * 100) / 100,12)

在sql server中可以达到的最大精度(无论如何都是单个值) 18.448253968253968253968253

来自ms的链接文档:

十进制[(p [,s])]和数字[(p [,s])]
固定精度和刻度数。当使用最大精度时,有效值为 - 10 ^ 38 +1到10 ^ 38 - 1.十进制的ISO同义词是dec和dec(p,s)。 numeric在功能上等同于十进制。

答案 1 :(得分:1)

计算结果的精度为based on some factors,这可能会使您的比例低于您的预期。试试这个:

SELECT CONVERT(DECIMAL(38, 35), 145.28)/63 *(8 * 100)

会给你

1844.825396825396825396825397

答案 2 :(得分:0)

问题在于精确度。当你在Sql中执行145.28 / 63时,它的计算结果为2.306031。如果你在Windows计算器中执行它,它的评估结果为2.3060317460317460317460317460317。因此,您将不同的数字相乘,从而得出结果的差异。

要获得与Navision相同的结果,请尝试使用精度非常高的小数:

SELECT cast(145.28 as decimal(35,30))/63 *(8 * 100) / 100

评估为18.4482539682539682

答案 3 :(得分:-1)

此处您的执行步骤正在创造这种差异。您可以尝试这样做以获得相同的结果。

SELECT 145.28 *(8 * 100)/63 / 100;

结果为18.4482539600.