计算两个数字的比例和精度

ijnw1ujt  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(401)

我有以下操作:

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?

2mbi3lxu

2mbi3lxu1#

可以在precision、scale和length(transact-sql)中找到确定计算结果的精度和规模的规则。
这里的行动是分裂。这里计算精度的适用公式是p1-s1+s2+max(6,s1+p2+1),当应用到我们的输入时,结果是27。比例的公式是max(6,s1+p2+1),在这种情况下,结果是15。

juud5qan

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)
;

下面是上面代码的结果。。。

相关问题