【mysql】再谈Round,Format和Decimal与四舍五入

【背景】

金融行业结构化数据处理对数据精度要求较高,不仅要求严格的四舍五入,还要求千分位等格式化。需要同时满足。

【问题】

一般常说的四舍五入用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处理的结果不一样了。

猜你喜欢

转载自blog.csdn.net/weixin_41697242/article/details/133360785