我很好奇在财务数据的计算方面存在任何“舍入”标准。我最初的想法是只在数据被呈现给用户(表示层)时执行舍入。
如果“舍入”数据用于进一步计算,应该使用“圆形”数字还是“原始”数字?有没有人有任何建议?
请注意,我知道不同的舍入方法,即银行家舍入等。
答案 0 :(得分:15)
第一个也是最重要的规则:使用decimal data type,永远不要使用二进制浮点类型。
当执行完全舍入时,可以通过法规强制执行,例如在Euro and national currencies之间进行转换。
如果没有这样的规则,我会以高精度进行所有计算,并且仅用于呈现,即不使用舍入值进行进一步计算。这应该会产生最佳的整体精度。
答案 1 :(得分:14)
我刚刚在我工作的财务软件公司问了一位灰熊大型机程序员,他说没有众所周知的标准,这取决于程序员的实践。
虽然自1906年以来统计学家已经意识到四舍五入问题,但很难找到支持它的财务标准。
根据this sit e,“欧盟委员会报告The Introduction of the Euro and the Rounding of Currency Amounts表明以前没有标准的方法来进行银行业务的四舍五入。”
通常,无论您使用什么基础(base-2或base-10),都使用对称舍入模式。
这将避免计算过程中的系统偏差。
这种模式是Round-Half-Even-Even,也称为“银行家四舍五入”。
使用允许您指定数字上下文明确性的语言工具,包括舍入和截断模式。例如,Python的decimal
模块。 C库所做的隐式假设可能不适合您的计算。
答案 2 :(得分:3)
我没有看到“统治所有人的一个标准”的存在 - 有任何数量的舍入规则(正如你所引用的),它们似乎是基于行业/客户/和货币代码发挥作用( http://en.wikipedia.org/wiki/ISO_4217) - 因为不是每个人都在小数点后使用2个位置,问题变得更加复杂。在一天结束时,您的客户需要指定他们想要实施的规则......
答案 3 :(得分:1)
令人沮丧的是,目前尚无明确的标准来指导程序员和作为法庭辩护。仅仅对工资表进行“常规”四舍五入会导致到处到那里的工资支票少付几美分,这是劳工律师吃得像裂缝的东西。
尽管基本工资率只能指定在小数点后两位(“您的时薪为$ 22.71 /小时”),但是诸如混合加班费(由一段时间内的多个工资率平均确定)之类的结果却是有效的。每小时23.37183475美元/小时。
您如何为此支付加班费?
15 hours x 23.37183475 x 1.5 = $525.87 rounded from $525.86628187
15 hours x 23.37 x 1.5 = $525.82
您为什么从我的客户那里窃取了五分钱?可悲的是,我不是在开玩笑。
以全精度值进行计算但显示截断的版本时,这会变得更加不舒服:您执行了上面的第一个计算,但薪水存根上的费率仅显示$ 23.37。
现在,薪资存根的计算方法不算一分钱,现在您必须解释一下,但是即使对雇员有利,劳动律师也可以闻到水中的血腥味并开始工作寻找其他东西。
一种方法是始终以雇员为中心,而不是朝着“自然”方向发展,因此永远不会有“系统性工资盗窃”的指控。
答案 4 :(得分:0)
考虑使用缩放整数。
换句话说,存储整数便士而不是分数美元。