关于sql convert(decimal(a,b),n) 对于数字n保留b位小数的问题,当b的最后一位为5时,偶尔会发生不进位的情况。
eg.
select (b.CSZF+a.ZGJFFS)/(a.CSZSXS*1.00) * a.CSCJQZ + a.FSCJ/(a.FSZSXS*1.00) * a.FSCJQZ,Convert(decimal(6,2),((b.CSZF+a.ZGJFFS)/(a.CSZSXS*1.00) * a.CSCJQZ + a.FSCJ/(a.FSZSXS*1.00) * a.FSCJQZ)) from TB_BKXX a,TB_CSCJ b where a.KSBH=b.KSBH and FSCJTJZT=1 and a.KSBH='100271218230029'
尝试解决方案1:先*100,取整再除以100
select (b.CSZF+a.ZGJFFS)/(a.CSZSXS*1.00) * a.CSCJQZ + a.FSCJ/(a.FSZSXS*1.00) * a.FSCJQZ,Convert(decimal(6,2),Convert(decimal(6,0),((b.CSZF+a.ZGJFFS)/(a.CSZSXS*1.00) * a.CSCJQZ + a.FSCJ/(a.FSZSXS*1.00) * a.FSCJQZ)*100)/100) from TB_BKXX a,TB_CSCJ b where a.KSBH=b.KSBH and FSCJTJZT=1 and a.KSBH='100271218230029'
select (b.CSZF+a.ZGJFFS)/(a.CSZSXS*1.00) * a.CSCJQZ + a.FSCJ/(a.FSZSXS*1.00) * a.FSCJQZ,Convert(decimal(6,2),Convert(decimal(6,0),((b.CSZF+a.ZGJFFS)/(a.CSZSXS*1.00) * a.CSCJQZ + a.FSCJ/(a.FSZSXS*1.00) * a.FSCJQZ)*100)/100) from TB_BKXX a,TB_CSCJ b where a.KSBH=b.KSBH and FSCJTJZT=1 and a.KSBH='100651015111028'
有的好使了,有的还不好使
解决方案二:对于n加一个十的负b+2次方的常数。比如取两位小数加一个0.0001
select (b.CSZF+a.ZGJFFS)/(a.CSZSXS*1.00) * a.CSCJQZ + a.FSCJ/(a.FSZSXS*1.00) * a.FSCJQZ,Convert(decimal(6,2),((b.CSZF+a.ZGJFFS)/(a.CSZSXS*1.00) * a.CSCJQZ + a.FSCJ/(a.FSZSXS*1.00) * a.FSCJQZ+0.0001)) from TB_BKXX a,TB_CSCJ b where a.KSBH=b.KSBH and FSCJTJZT=1 and a.KSBH='100271218230029'
问题解决。
查找网上的方法说是算数机制的问题???round函数普遍存在,但是decimal好像比较少见。