财务或类财务系统数值精度设计
类型
计量型数值
结算型数值
计算型数值
计量型数值即通常说的数量,数值的后面会有一个计量单位,两者共同来描述(实体/虚拟)物品。
计量单位参考计量单位 - 维基百科,自由的百科全书 (wikipedia.org)。
交易双方在资金给付时使用的资金数值为结算型数值,结算型数值由交易双方约定,并且受到货币最小支付单位的限制。税额、金额、合计金额都是结算型金额。
举个例子:A 向 B 购买商品 XX 5 件,每件商品 ¥1.01。理论上 A 应该向 B 支付 ¥5.05 ,B 和 A 说我们结算到元即可,那么 A 只需要支付 ¥5.00 向 B 就行了。
由于人民币最小的支付单位是分,我们就只能定义分以上的单位结算。此时如果改为比特币支付,最小单位就是聪,1 聪=0.00000001 比特币。
最后是计算型数值,这种类型的数值往往是系统设计过程中最容易出问题的。因为结算型的数值绝大部分是由计量型数值和计算型数值计算后得出的结果,计量值是一个物理上的结果不具有可变性,要保证结算数值的准确就必须保证计算型数值的准确。不含税价就是计算型数值。
精度为什么重要
在一次交易中,购买方向销售方购买多个商品,每个商品有一个固定的价格,价格乘购买数量得出这个商品的交易金额。再把所有的商品交易金额相加后得出此次交易的总金额,买卖双方在根据总金额进行资金给付。
为什么一定要把每一个商品都计算出一个合计金额在结算呢,原因有两个:1 每个商品的销售价格不同 2 商品的属性不同税率也不相同,合法的交易中必须根据商品的税率和无税价格计算出税额,开具发票并报税。
此时就出现了无税单价、含税单价、不含税金额、含税金额、税额、数量、合计金额这么多的与结算有关的数字,下面我们看看他们间的关系:
现实中我们描述的商品价格指的是含税的价格,比如买个手机 ¥999.00 ,手机的实际价格为 ¥884.07 ,税率为 13%,税额为 ¥114.93。
再看一下购买汽油的情况,汽油的不含税价格是一个 8 位的小数,但油价(含税价格)是 ¥6.90。
一个准确的精度能够保证在整个计算的过程中能够尽可能地避免乘除过程中的无限循环小数以及四舍五入造成的计算结果偏差。
精度设计
计量型数值
计量型数值由用户输入,在现实中有一个固定的衡量标准。一般情况下 3 位小数可满足需求,如果有更精确的计量系统要支持自定义精度。
计量型数值都是在前台输入或获取的,不允许系统在后端重新计算或调整,所以不存在精度误差问题。因为误差已经在线下解决。
计算型数值
用户不能直接修改,必须修改其它值后由系统计算得出结果。一般情况下 8 位小数即可保证计算精度,精度越高结果的准确性也越高,考虑系统的计算性能和稳定性尽可能支持更高精度。
结算型数值
结算型数值的精度要根据货币交易的最小单位设计,人民币小数点后两位。这里误差主要因为计算结果的的小数精度大于结算小数精度,一般采用误差更小的四舍六入五成双法舍弃多余的小数。
原文:https://www.xiaolaiwo.com/article/caiwuhuoleicaiwuxitongshuzhijingdusheji.html
版权声明: 本文为 InfoQ 作者【路边水果摊】的原创文章。
原文链接:【http://xie.infoq.cn/article/484f9d1961a1ef1b60369d210】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论