为什么 SQL 服务器将精度削减到 3 或 6 位

Why SQL Server cut precision to 3 or 6 places

我在sql(sql server management studio)

中的计算遇到了很大的问题

我有一个变量 declare @KursEur decimal(32,10) = 4.2617000000

点运算后需要10个位置

我需要将数据库中的值乘以一个点精度后10位的变量的结果

列名 = decimal(32,10)

示例:

select ColumnName*@KursEUR 
from TableName

结果:364947858427.467456

 select ColumnName*4.2617000000 
 from TableName

结果:364947858427.46745556204873 <-我需要这个结果

我试过了,但没有给出预期的结果:

 select CAST(ColumnName as numeric(32,10))* CAST(@KursEUR as numeric(32,10)) 
 from TableName

select CAST(ColumnName as float)* CAST(@KursEUR as float) 
 from TableName

 select CAST(ColumnName  as numeric(32,10))* CAST(@KursEUR as float) 
 from TableName

 select CAST(ColumnName as float)* CAST(@KursEUR as numeric(32,10)) 
 from TableName

 select ColumnName* CAST(@KursEUR as float) 
 from TableName;
select ColumnName* CAST(@KursEUR as numeric(32,10)) 
 from TableName

select CAST(ColumnName as numeric(32,10))* @KursEUR 
 from TableName

select CAST(ColumnName as float)* @KursEUR
 from TableName

 select CAST(ColumnName*@KursEUR as float) 
 from TableName

 select CAST(ColumnName*@KursEUR as numeric(32,10)) 
 from TableName

当您在 SQL 服务器中将两个数字相乘时,乘积的精度是通过将两个数字的精度相加再加一来确定的。在您的情况下,如果两个数字的精度均为 32,则生成的产品需要精度为 65!最大值为 38(或更早的版本更小)!!

诀窍是使用较小的变量大小。如果将 @KursEur 转换为十进制 (11,10)。并将 ColumnName 转换为 decimal(25,10) 之类的东西,它将起作用。根据您的需要平衡两个数字之间的精度,只要确保它们相加等于或小于 37 即可。

SELECT CAST(85634338040.5630277969 AS DECIMAL(25,10)) * CAST(4.2617000000 AS DECIMAL(11,10))