SQL Server - 数字和浮点数据类型

时间:2015-04-24 20:00:43

标签: sql-server

我无法将准确度提高到尽可能多的小数位数。如果我将6个不同的数字转换为numeric(36,18),然后在它们之间进行计算,则结果值将在6位小数处被截断。如果我使用浮动,我可以走得更远,但从我听到的那些也被切断了。

任何帮助都会很棒,谢谢。

2 个答案:

答案 0 :(得分:0)

  

结果的精度:[p1-s1 + s2 + max(6,s1 + p2 + 1)] - >   36-18 + 18 + max(6,18 + 36 + 1)= 36 + 55 = 91比例结果:[max(6,s1 + p2)   + 1)] - > max(6,18 + 36 + 1)= 55在这种情况下,精度大于38,在这种情况下(如文档中所述)

     

*结果精度和比例的绝对最大值为38.当结果精度大于38时,相应的比例为   减少以防止结果的整体部分被截断。

     

比例必须减少(91-38 =)53,即(55-53 =)2 ......   最小刻度长度为6(因为表达式   scale = [max(6,s1 + p2 + 1)])并且它不能低于6 -   我们有结果

答案 1 :(得分:0)

根据计算的顺序,事情可能会很棘手。

考虑变量:

DECLARE @A as NUMERIC(36,19) = 100
DECLARE @B as NUMERIC(36,19) = 480
DECLARE @C as NUMERIC(36,19) = 100

计算A / B * C

如果您想使用公式(@Dudi答案)计算A / B * C,我们有:

A / B的类型为NUMERIC(38,6)

结果将是0.208333(比例为6)乘以100,我们将获得20.833300

计算A * C / B

A * C的结果是NUMERIC(38,6)型的10000。通过C潜水,结果将是20.833333型NUMERIC(38,6)

然后,结果可能会有所不同,具体取决于计算顺序(https://dba.stackexchange.com/questions/77664/how-does-sql-server-determine-precision-scale中指出了同样的问题)。

SQL Fiddle