【背景】
金融行业结构化数据处理对数据精度要求较高,不仅要求严格的四舍五入,还要求千分位等格式化。需要同时满足。
【问题】
一般常说的四舍五入用Round其实并不严谨,Round为了取舍在科学上的平均,采用的是四舍六入五留双,和严格的四舍五入有一定几率发生末位差异。
【知识】
“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上。"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:5前为奇数,舍5入1;5前为偶数,舍5不进(0是偶数)。
【解决方法】
不要用Round,而用Format配合Decimal实现严格的四舍五入和金额千分位格式化。
内部用decimal先取四舍五入,外部用format处理格式。
【代码演示】
数据如下,给出四舍六入五留双中,四舍和五留双共三个数值例子:
写如下查询来比对结果:
select
fAmount1 as origin1,round(fAmount1,2) as round1,convert(fAmount1,DECIMAL(10,2)) as decimal1,
fAmount2 as origin2,round(fAmount2,2) as round2,convert(fAmount2,DECIMAL(10,2)) as decimal2,
fAmount3 as origin3,round(fAmount3,2) as round3,convert(fAmount3,DECIMAL(10,2)) as decimal3
from numberprocess
最终结果:
分析:可以看到,第二批数字中,用round处理的结果和用decimal处理的结果不一样了。