爱摄叽歪

爱生活爱叽歪,一个不务正业的人!

商务系统关于金额的存储和计算问题小结

在做商城系统的时候,一定会遇到金额的计算!不就是基本的算数么?真不是,由于之前的经验问题,真有点坑。之前在调用微信支付的时候,发现微信的传入金额是以分为单位的,也就是传入的参数一定是正整数,以前在用支付宝接口的时候没有这样。

当系统运转到一定的场景时,问题出来了。以元为单位储存的double类型,在遇到除法计算、小数的打折计算时,就会遇到应为精度的问题,有一分钱的误差。当量大的时候,这个误差就会被放大到不得了。之前将double转为decimal计算,也还是会有误差。
这个时候才醒悟,微信以分为单位传入支付金额是有道理的。不过这里也会遇到分为单位有小数问题,例如:0.01元,一分钱为零头的,在打个八折就是0.8分。但是这里就比较容易做统一的换算了。在我们下场景里,只要分还有小数,就统一向上去取整,将0.8分取1分,最后得出的金额还是以分为单位的一个整数。
以C#计算价格的折扣为例,具体到代码是:

double orderPrice = 12.11;//订单价格
double discountCoupon = 0.8;//折扣
double intPayPrice =((orderPrice * 100) * (discountCoupon* 100)) / 100;//返回968.8,即还有个0.8分的尾数
double payPrice = (double)(Math.Ceiling(intPayPrice) / 100);//返回9.69

这里intPayPrice是以分为单位计算出来的结果
payPrice是还原为以元为单位的金额,Math.Ceiling(intPayPrice)是一个必须的,将有小数的分向上取为一个整数分。

不允许评论