积极答复者
如何让sql server乘除法计算精准

问题
答案
-
decimal型表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2), 它们运算结果的位数有如下算法: 运算 结果精度 结果小数位数 ---------------------------------------------------------------- e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2) e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2) e1 * e2 p1 + p2 + 1 s1 + s2 e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1) e1 { UNION | EXCEPT | INTERSECT } e2 max(s1, s2) + max(p1-s1, p2-s2) max(s1, s2) 在本例中,当e1/e2时,结果小数位数取 max(6,s1+p2+1),但s1+p2+1>38,所以为了不截断整数部分,系统取了6. 这就是为什么你把总精度设得那么高,小数部分反而总是6的原因。
s1+s2 不超过38就应该不会被截断。- 已建议为答案 Stephanie Lv 2011年7月19日 8:34
- 已标记为答案 Stephanie Lv 2011年7月23日 12:29
-
- 已建议为答案 Stephanie Lv 2011年7月19日 8:34
- 已标记为答案 Stephanie Lv 2011年7月23日 12:29
全部回复
-
decimal型表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2), 它们运算结果的位数有如下算法: 运算 结果精度 结果小数位数 ---------------------------------------------------------------- e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2) e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2) e1 * e2 p1 + p2 + 1 s1 + s2 e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1) e1 { UNION | EXCEPT | INTERSECT } e2 max(s1, s2) + max(p1-s1, p2-s2) max(s1, s2) 在本例中,当e1/e2时,结果小数位数取 max(6,s1+p2+1),但s1+p2+1>38,所以为了不截断整数部分,系统取了6. 这就是为什么你把总精度设得那么高,小数部分反而总是6的原因。
s1+s2 不超过38就应该不会被截断。- 已建议为答案 Stephanie Lv 2011年7月19日 8:34
- 已标记为答案 Stephanie Lv 2011年7月23日 12:29
-
- 已建议为答案 Stephanie Lv 2011年7月19日 8:34
- 已标记为答案 Stephanie Lv 2011年7月23日 12:29
-
declare @temp_par4 as decimal(25,10)
declare @dividend_par1 as decimal(19,2)
declare @zero_par4 as decimal(25,15)
declare @temp_par1 as decimal(25,10)set @temp_par1=559552119.9708648926
set @dividend_par1=245373146.28
set @zero_par4=0.070287068415871
set @temp_par4=(@dividend_par1*@zero_par4/12+
(0.315*@temp_par1-@dividend_par1*@zero_par4+@dividend_par1*@zero_par4/12)/(1-cast(1 as decimal(25,10))/12)/12)
select @temp_par4得出的结果是16023537.9809830000
而实际直接代入数字select 245373146.28*0.070287068415871/12+
(0.315*559552119.9708648926-245373146.28*0.070287068415871+245373146.28*0.070287068415871/12)/(1-cast(1 as decimal(25,10))/12)/12得到:16023537.9809833278762
都好像很懂一样,回的都很干脆直接,那我看你帮我解决多个变量计算小数精度问题,你看这个怎么弄