1 问题背景
电商为了提高销量,常常会做一些优惠活动,吸引顾客购买。优惠活动的优惠金额会存在精度问题。比如,购买A商品3件、B商品5件、C商品7件,享受满额打折、满件减价、满额赠送等等的优惠活动。那么生单的时候需要记录A商品的优惠金额、B商品的优惠金额、C商品的优惠金额,整个订单的总优惠金额。此时每种商品的优惠金额加起来是否等于总的优惠金额呢?如果不相等要怎么处理?
2 前言
本博客是笔者在真实的生产环境上遇到的问题,非本地虚拟机搭建的demo或者自学的demo,博客仅供自己总结参考,如有不正确的地方请指出。
3 子优惠金额的累加值与总优惠金额不相等的影响
为方便阐述,假设累加所有商品的优惠金额的值为a,总优惠金额为b,商品总售价为c,运费为d,税费为e,订单总实付为f。
-
第三方物流平台或者仓储平台或bi平台,会校验a是否等于b,如果不相等,则会令这些第三方平台有异常。
-
某些支付业务的公司,如Paypal,也会校验a是否等于b,或者校验
f 是否等于 c - a + d + e
,如果不相等会导致订单支付失败。
4 如何解决
4.1 思想
针对每种优惠活动,先计算总的优惠(必须显式进行小数点后几位的保留,如果数据库的字段要求保留2为小数,那么java代码就显示保留2位小数),然后再分摊优惠金额到每个商品(同样要显式进行小数点后几位的保留),最后一个商品要用
总的优惠金额 - 已分摊出去的金额
。将每种优惠活动的总优惠累加起来就是整个订单的总优惠金额。
总结就是先算总的再进行分摊,最后一个商品用减法,订单总优惠等于所有优惠活动总的优惠金额累加起来。