这是一个会计软件,因此值将四舍五入为分(2位小数)。
鉴于最终价值发票金额$ 4488.70(我们可以调用此值final
),以下列方式获取初始小计值(subtotal
):
subtotal
+ round(0.07 * subtotal)
- round(0.02 * subtotal)
= final
如果final
为4488.70美元,
直接按1.02划分并获得$ 4400.6862745(四舍五入至$ 4400.69)
对于发票,这不符合:
Subtotal 4400.69
VAT (7%) 308.05 ==> round(4400.69 * 0.07)
WHT (5%) 220.03 ==> round(4400.69 * 0.05)
==========
Final 4488.71 (4400.69 + 308.05 - 220.03)
这不是想要的最终价值(减去1美分)。
这里更好的小计应该是4400.68,但我们如何通过算法获得呢?
Subtotal 4400.68
VAT (7%) 308.05 ==> round(4400.68 * 0.07)
WHT (5%) 220.03 ==> round(4400.68 * 0.05)
==========
Final 4488.70 (4400.68 + 308.05 - 220.03)
在内部,我们建议首先获得暂定的subtotal = final/1.02
,然后继续前进以查看我们是否获得最终预期值,如果没有,我们会尝试subtotal - 1
并最终{{1} }。
subtotal + 1
final/1.02
final/1.02 - 0.01
是否有更好,更有效且仍然可靠的方法?
答案 0 :(得分:2)
您想要的是一般无法实现的目标。可能存在某些值final
,其中不存在此类subtotal
。 (我现在懒得去做一个数学证明,但我确信可以找到一些值,subtotal
产生desiredFinal - 0.01
和subtotal + 0.01
产生desiredFinal + 0.01
到期四舍五入的方式)。
有两种常见的解决方法:
subtotal = final/1.02
,然后计算其他所有内容,就像您在第一个示例中所做的那样:
Subtotal 4400.69
VAT (7%) 308.05 ==> round(4400.69 * 0.07)
WHT (5%) 220.03 ==> round(4400.69 * 0.05)
==========
Final 4488.71 (4400.69 + 308.05 - 220.03)
如果存在差异,请在subtotal
和final
中添加或删除它。这意味着增值税和WHT将不准确w.r.t. subtotal
。
Subtotal 4400.68 ==> one cent removed
VAT (7%) 308.05
WHT (5%) 220.03
==========
Final 4488.70 ==> one cent removed
明确提及舍入错误:
Subtotal 4400.69
VAT (7%) 308.05
WHT (5%) 220.03
Rounding - 0.01
==========
Final 4488.70
选择哪一个取决于您当地的税法。