为什么 SQL Server 将精度降低到 3 或 6 位

Why SQL Server cut precision to 3 or 6 places

提问人:aykax 提问时间:10/9/2020 最后编辑:aykax 更新时间:10/10/2020 访问量:115

问:

我在sql(sql server management studio)中的计算有一个大问题

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

我需要 10 个位置后点

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

列名 = 十进制 (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-server 精度

评论

6赞 Jeroen Mostert 10/9/2020
如何根据输入精度以及小数位数和运算确定精度和小数位数的规则非常复杂,但它们确实解释了您的结果。但是,在所有这些中,您都未能说明类型是什么。ColumnName
1赞 Damien_The_Unbeliever 10/9/2020
您可能需要考虑有关精度和小数位数的文档,尤其是显示乘法后结果的表格。
0赞 aykax 10/9/2020
列名 = 十进制 (32,10)
0赞 Thom A 10/9/2020
这里真正的问题是,你“需要”32的精度吗?您可以存储的最大数字是 9,999,999,999,999,999,999,999.999999999999;那是 10 六分之一 - 1...一个真正巨大的数字。decimal(32,10)
0赞 Jeroen Mostert 10/9/2020
好吧,你不能将 2 相乘并保持完全精度,因为这超出了 SQL Server 可以支持的范围。您的输入实际上有多少位数字?精度问题的通常解决方案是降低精度(保持刻度完好无损)。decimal(32, 10)

答:

2赞 TK Bruin 10/10/2020 #1

在 SQL Server 中将两个数字相乘时,产品的精度是通过将两个数字的精度相加 1 来确定的。在您的例子中,如果两个数字的精度均为 32,则生成的产品需要精度为 65!最大值为 38(在早期版本中或更小)!!

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

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