Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server计算会产生意外的结果_Sql_Sql Server - Fatal编程技术网

SQL Server计算会产生意外的结果

SQL Server计算会产生意外的结果,sql,sql-server,Sql,Sql Server,我有一个非常奇怪的情况,我相信这是一个解释 我试图计算一些东西,下面是数值: SELECT 145.28/63 *(8 * 100) / 100 -- returns: 18.4482480000 问题是这是不正确的,如果我使用Windows Calculator进行计算,那么它将返回更精确的值: 145,28/63*(8-0*100)/100=1844825396825397 为了让它与SQL Server配合使用,我必须做很多更改: SELECT 145.28 * 100 * 8 /

我有一个非常奇怪的情况,我相信这是一个解释

我试图计算一些东西,下面是数值:

 SELECT 145.28/63 *(8 * 100) / 100 -- returns: 18.4482480000
问题是这是不正确的,如果我使用Windows Calculator进行计算,那么它将返回更精确的值:

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

为了让它与SQL Server配合使用,我必须做很多更改:

SELECT 145.28  * 100 * 8 / (100 * 63) --RETURNS: 18.4482539682539
为什么我需要在SQL Server中更改数字而不需要在windows中更改


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

自动分配的默认数据类型无法保持所需的精度。通过将第一个数字显式转换为更精确的数据类型(如下所示),可以很容易地解决此问题:

SELECT CAST(145.28 AS decimal(38,35))/63 *(8 * 100) / 100 
--returns 18.448253968253968253968253
SELECT ROUND(CAST(145.28 AS float)/63 *(8 * 100) / 100,12)
从那时起,sql server理解不要向下转换它,因此结果将变为18.448253968253968253968253

decimal的语法为decimal(总位置,其中逗号后)。别忘了逗号也有一个位置

这是一份文件

如果要限制小数,可以使用如下舍入:

SELECT CAST(145.28 AS decimal(38,35))/63 *(8 * 100) / 100 
--returns 18.448253968253968253968253
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在功能上等同于decimal。

这里,您的执行步骤产生了这种差异。你可以试试这个来达到同样的效果

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

这将导致
18.4482539600。

问题是精确的。在Sql中执行145.28/63时,其计算结果为2.306031。如果在windows计算器中执行此操作,则计算结果为2.3060317460317460317。所以你乘以不同的数字,结果就不同了

要获得与Navision中相同的结果,请尝试使用精度非常高的十进制:

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

它的估值为18.4482539682539682

计算结果的精度可能会给您一个低于预期的刻度。试试这个:

SELECT CONVERT(DECIMAL(38, 35), 145.28)/63 *(8 * 100)
这会给你

1844.825396825396825396825397

OP已经能够对操作进行重新排序。事实上,他/她在问题中加入了改进的查询,将您的查询更改为选择CAST(145.28为十进制(38,20))*100*8/(100*63),这给了我一个更精确的结果:18.44825396825396,但我想要这个值:18。44825396825396820000@Tristan我试图计算这个表达式的最终精度和比例,然后回来。。。你真的做到了。谢谢哥们。谢谢,那么我怎么才能得到所有20个小数?@ USE3514988-首先,退一步,考虑你是否需要20小数的精度。大多数应用程序不需要那么高的精度,如果确实需要,SQL可能不是正确的工作语言。并不是所有的20位小数-表达式计算一个具有循环小数表示的值。你也可以要求“全部”40位小数,或“全部”100000000位小数。@Damien_不信者,正如你在我的回答中所看到的,20个位置在sql server中是非常可行的。@Tristan-是的,但我试图指出,你可以重复任意多的
968253
,20个位置并不比10个或40个位置更“正确”,而且,实际上需要20个职位是非常罕见的,所以我试图提醒OP考虑他们的实际需求。“达米恩- THI不信者,这是一个非常有效的观点,考虑到软件规格的要求,有点不相关,但毫无疑问是有效的。从你的评论中我不太清楚;)