您的位置:首页 > 其它

库存计算小数点金额怎么消除误差

2011-07-15 01:35 267 查看
谈谈我的一点经验。

一般来说产生误差主要是因为四舍五入,而金额和单价、数量的小数位数都是有限的。为了避免小数点误差,要注意以下几点,否则经常会导致可能出库时数量出完了,但是金额还不为零的情况出现(不过这种情况很难避免,可以允许用户做调整,做一些特殊的出入库单,即允许只有金额、没有数量的出入库单,其实这种单据常用的,这是别话)

注意几个算法:
1、多用加法、少用乘法。
例如订单上可能有这么几个字段:数量、单价、含税单价、税率、金额、税额、价税合计。关系如下:
数量×单价=金额
数量×含税单价=价税合计;
数量×单价×税率=税额;
金额+税额=价税合计。

如果这里你分别用乘法算出金额、税额、价税合计,那么最后很可能就出现金额+税额不等于价税合计。这就是我前面说的不能自圆其说了,对于这种情况,你只能用乘法算出其中的两个,然后第三个,就其中的这两个金额做加法或者减法得到。例如,先用乘法算出金额和税额,然后用金额+税额得出价税合计;或者先用乘法算出价税合计和税额,然后用减法,算出金额。这样就不会产生误差。

2、注意用“倒挤”算法(分摊误差)
数量乘以单价不等于金额的现象肯定存在,这是允许的,实际手工业务中也是允许的,因为四舍五入的关系,谁也避免不了这个;但是软件中的做法是:允许误差,但是误差们要能自圆其说。时刻牢记要让“总计数要等于明细数的合计”。例如,总计数是A,总计数被分成了若干份,分别是B、C、D,最后一定要保证:B+C+D=A。
例如,一笔钱是456.87元,要按比例分成三份,第一份是15.8%,第二份是47.3%,第三份是36.9%,没有经验的程序员肯定是用总金额分别乘以三个比例,那肯定就有问题了,第一份:456.87×0.158=72.19。第二份:456.87×0.473=216.1,第三份:456.87×0.369=168.59,那么把这三个数再合计起来等于多少?72.19+216.1+169.59=456.88。比原来的总额多出了一分钱!这就不平了。所以,碰到这种情况,一定要选择分摊误差的地方,一般来说都是用最后一笔分担误差,所以叫做倒挤算法。所以这个例子应该这么算,前两笔都用乘法没问题,到了最后就一定不能总额乘以比例了,而是要用总额减去前面两笔的合计数,得出第三笔:456.87-(72.19+216.1)=156.58。这样就对了。

3、每一次乘除法以后立即按照精度四舍五入
一般在软件系统中会预先让用户定义数量、单价、金额的小数位数,这是常识性的做法,但是程序员必须在程序中注意四舍五入的时机:在得出一个结果(数量、单价、金额三者任何一个)之后,必须立即四舍五入以后,再投入其他运算,如果做了一次乘法、除法以后却没有立即根据定义的精度四舍五入,而是直接投入其他运算,最后再四舍五入,那肯定不对。例如:单价:8.49,数量:45.5789,用数量乘以单价得出金额:386.964861,如果你这时候你不把这个金额先四舍五入了再投入其他运算,那么肯定产生误差。

4、写程序注意选择相同类型的数值类型进行乘除运算。如果不相同类型的数值类型乘除,计算机自己都有可能产生误差,我就碰到过计算机算出:3.1×2=6.3这种情况,当时就立刻晕死了……

一点经验,供参考。

介绍个简单的办法:
我是这样来尾数的,每次计算出库金额时,不是直接取单价×数量。而是出库数量/库存数量×库存金额。
这样就可以了!

大家说得都很有道理,我就来总结一下,呵呵,不要砸我。
首先,小数点位数管理一般需要主表进行设定和维护。比如对于数量管理,可以针对物料设定是否是整数管理,如果是,则不允许小数出现。如果是小数管理,还可以设定,到一定数量系统自动归零(在流程业比较普遍),如果一桶油漆在系统中剩下0.00001斤,系统自动认为0,这样可以避免atht(秋水) 兄的问题。至于在程序中用什么类型的变量这个到不是关键(我在VB中就用DOUBLE,不过在VB.NET中中了微软一大刀,具体问题,有兴趣可以到.NET论坛看我的问题,超级无耻微软)

其次,是单价和金额问题,还需要进行设定。我现在做的ERP系统中对于单价,金额和成本单价可以进行分别设定,方便管理。不过话说回来,atht(秋水) 兄说得有道理,金额计算中小数管理是比较烦。为什么呢,呵呵有是比较有中国特色的问题。比如一个购买,数量 和 单价 应该是固定的(你不要告诉我你用什么价格买多少数量都不知道)。那么,金额 = 数量 * 单价 ,然后金额根据设定位数截位就可以了。但是在中国这个单价是含税单价,如果你需要增值税票,就必须换算成无税单价。这就烦了,由于需要和增值税发票匹配,你就必须用到atht(秋水) 兄说得一堆东西了,呵呵。我就不多说了。
最后,我给你一个好消息,lydong(西瓜水) 兄说得对,财务上有相应处理,如用友中有汇兑损益专门针对异币种换算差异,还有材料成本差异的科目可以利用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: