SQL Server计算会产生意外结果

use*_*987 3 sql sql-server

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

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

 SELECT 145.28/63 *(8 * 100) / 100 -- returns: 18.4482480000
Run Code Online (Sandbox Code Playgroud)

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

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

我不得不改变很多以使它与SQL Server一起工作:

SELECT 145.28  * 100 * 8 / (100 * 63) --RETURNS: 18.4482539682539
Run Code Online (Sandbox Code Playgroud)

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

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

Tri*_*tan 8

自动分配的默认数据类型不会保持您想要的精度.通过将第一个数字显式地转换为更精确的数据类型,可以很容易地解决这个问题,如下所示:

SELECT CAST(145.28 AS decimal(38,35))/63 *(8 * 100) / 100 
--returns 18.448253968253968253968253
Run Code Online (Sandbox Code Playgroud)

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

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

这是一个文档链接.

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

SELECT ROUND(CAST(145.28 AS float)/63 *(8 * 100) / 100,12)
Run Code Online (Sandbox Code Playgroud)

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

来自ms的每个链接文档:

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