我有以下操作:
SELECT 9 / 2;
结果是4而不是4.5。我将代码修改为:
DECLARE @p1 AS INT = 9, @p2 AS INT = 2; SELECT CAST(@p1 AS NUMERIC(12, 2)) / CAST(@p2 AS NUMERIC(12, 2));
新的结果是:4.500000000000000为什么我的结果中有额外的0?
2mbi3lxu1#
可以在precision、scale和length(transact-sql)中找到确定计算结果的精度和规模的规则。这里的行动是分裂。这里计算精度的适用公式是p1-s1+s2+max(6,s1+p2+1),当应用到我们的输入时,结果是27。比例的公式是max(6,s1+p2+1),在这种情况下,结果是15。
juud5qan2#
这个答案并没有回答op明确的问题“为什么我的结果中有额外的0?”。桑德拉的好职位做到了这一点。然而,这个答案确实显示了一种方法,可以不必忍受所有尾随的零(如果你需要这么做的话)。虽然你真的需要在sandra的好文章中提供的链接上阅读这篇文章(特别是因为多次连续的数学运算会降低精确度和比例,从而损害精确度),我从peter“peso”larsson那里学到了一个非常巧妙的技巧,它进行了必要的计算,并产生了一个非尾随零的结果。以下是人们尝试的不同方法和“比索”演示的方法。这是因为sql server处理“工程符号”的方式,可以通过在分子(在本例中)中添加一个缩写的“工程符号”来表示“0”的值,其形式为“0e”(与“0e0”或“n”表示“0en”的任何合法值相同)。
SELECT IntegerMath = v.Numerator/v.Denominator ,ZeroTrick = (0.0+v.Numerator)/v.Denominator ,Conversion = CONVERT(DECIMAL(9,2),v.Numerator)/v.Denominator ,PesoTrick = (0E + v.Numerator)/v.Denominator FROM (--===== Contains Numerators and Denominators left to right VALUES (9,2) ,(2,9) ,(1,3) ,(3,1) ,(10,4) ,(4,10) ,(1000,5) ,(5,1000) ) v (Numerator,Denominator) ;
下面是上面代码的结果。。。
2条答案
按热度按时间2mbi3lxu1#
可以在precision、scale和length(transact-sql)中找到确定计算结果的精度和规模的规则。
这里的行动是分裂。这里计算精度的适用公式是p1-s1+s2+max(6,s1+p2+1),当应用到我们的输入时,结果是27。比例的公式是max(6,s1+p2+1),在这种情况下,结果是15。
juud5qan2#
这个答案并没有回答op明确的问题“为什么我的结果中有额外的0?”。桑德拉的好职位做到了这一点。
然而,这个答案确实显示了一种方法,可以不必忍受所有尾随的零(如果你需要这么做的话)。
虽然你真的需要在sandra的好文章中提供的链接上阅读这篇文章(特别是因为多次连续的数学运算会降低精确度和比例,从而损害精确度),我从peter“peso”larsson那里学到了一个非常巧妙的技巧,它进行了必要的计算,并产生了一个非尾随零的结果。以下是人们尝试的不同方法和“比索”演示的方法。这是因为sql server处理“工程符号”的方式,可以通过在分子(在本例中)中添加一个缩写的“工程符号”来表示“0”的值,其形式为“0e”(与“0e0”或“n”表示“0en”的任何合法值相同)。
下面是上面代码的结果。。。