我无法将准确度提高到尽可能多的小数位数。如果我将6个不同的数字转换为numeric(36,18)
,然后在它们之间进行计算,则结果值将在6位小数处被截断。如果我使用浮动,我可以走得更远,但从我听到的那些也被切断了。
任何帮助都会很棒,谢谢。
答案 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中指出了同样的问题)。