除法时TSQL十进制精度问题

除法时TSQL十进制精度问题,tsql,math,sql-server-2012,Tsql,Math,Sql Server 2012,我对TSQL中的数字除法有问题。我已经阅读了该页面,但仍然无法理解为什么会出现以下问题: PRINT 1.4259276982890801000000/0.4259276982890801000000 -- Result 3.347816317222208 DECLARE @VAR1 DECIMAL(30,22) = 1.4259276982890801000000 DECLARE @VAR2 DECIMAL(30,22) = 0.4259276982890801000000 PRINT @V

我对TSQL中的数字除法有问题。我已经阅读了该页面,但仍然无法理解为什么会出现以下问题:

PRINT 1.4259276982890801000000/0.4259276982890801000000
-- Result 3.347816317222208

DECLARE @VAR1 DECIMAL(30,22) = 1.4259276982890801000000
DECLARE @VAR2 DECIMAL(30,22) = 0.4259276982890801000000
PRINT @VAR1/@VAR2
-- Result 3.34781631
问题

  • 那么,为什么在这些情况下,当数字完全相同时,我会看到不同的精度呢
  • 我怎样才能修好它

第一个
打印
语句中文字的实际精度和比例为
十进制(23,22)
十进制(22,22)
。根据,结果类型为十进制(38,15)。您可以使用
sp\u description\u first\u result\u set
观察这一点:

EXEC sp_describe_first_result_set N'SELECT 1.4259276982890801000000;';
EXEC sp_describe_first_result_set N'SELECT 0.4259276982890801000000;';
EXEC sp_describe_first_result_set N'SELECT 1.4259276982890801000000/0.4259276982890801000000;';
变量都是
十进制(30,22)
,因此结果是
十进制(38,8)

您可以通过指定不同的精度和变量比例来修复它:

DECLARE @VAR1 DECIMAL(23,22) = 1.4259276982890801000000;
DECLARE @VAR2 DECIMAL(22,22) = 0.4259276982890801000000;
SELECT @VAR1/@VAR2;

或者
选择1.4259276982890801000000,SQL_Variant_属性(1.4259276982890801000000,'BaseType')作为基类型,SQL_Variant_属性(1.4259276982890801000000,'Precision')作为精度,SQL_Variant_属性(1.4259276982890801000000,'Scale')作为刻度。很棒的插图+1。更多的sys.dm_exec_description_first_result_set()我自己:)有趣。但同样,如何修复它。因为我把我的问题缩小到了一个简单的划分。但是,我的整个计算(在存储过程中)从5个输入值开始,然后除以多次,例如,
@Var1/@Var2/@Var3/@Var4/@Var5
,您知道了。当然,我的计算也包括和、减、乘和幂。所以我不能简单地定义所有“sub”的精度outcomes@hwcverwe,当每个表达式的声明精度和比例与实际值不同时,我没有一个简单的解决方案,因为SQL Server需要为每个中间结果和最终结果容纳可能非常大/很小的值。请注意,如果将变量声明为
十进制(17,16)
,则结果将更精确为3.34781631722208507876。
DECLARE @VAR1 DECIMAL(23,22) = 1.4259276982890801000000;
DECLARE @VAR2 DECIMAL(22,22) = 0.4259276982890801000000;
SELECT @VAR1/@VAR2;