我有一个非常奇怪的场景,我确信这是一个解释。
我试图计算一些东西,这里是值:
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
答案 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.