用Java计算交易费用

时间:2011-03-07 00:33:24

标签: java math

假设您有网站可以保持每个用户的平衡。您可以为每个用户提供选项,以便通过PayPal,Amazon FPS,Authorize.NET eCheck和信用卡将资金存入其余额中,也可以将其存入一次。

上述每家公司都收取费用。由于您是接收方,因此您需要支付费用(自适应PayPal API除外,您可以说谁将支付费用)。

所以,假设网站用户(发件人)将存入$ 1000.00 并允许选择器费用为2.9%加上0.30美元的固定费用= - 29.30美元 所以接收者(网站所有者)最终得到$ 970.70

如果您尝试收取1029.30美元的费用,最终会收到999.1503美元 如果您试图收取1031.11美元,那么您最终可以获得$ 1000.90781,这是可以接受的(这是当费用增加0.181%至3.081%+ 0.30时)

所以这个问题是,在Java方法

中计算0.181%的最佳方法是什么

我知道这比Java问题更多的是数学问题,但是用于猜测最佳费用百分比的最佳算法是什么,因此最终值将尽可能接近网站用户尝试的最终值存款。

因此该方法应采用实际费用2.9%(乘法费用为0.029),修正费用为用户试图存入的金额0.30并计算出最终收费金额尽可能接近存款量。

我一直在做的方法是试图增加2.9%,直到扣除费用后我略微上涨。

更新

根据下面的答案,我编写了这种方法。任何进一步的建议都非常受欢迎:

public static float includeFees(float percentageFee, float fixedFee, float amount) {
    BigDecimal amountBD = new BigDecimal(amount);
    BigDecimal percentageFeeBD = new BigDecimal(1-percentageFee);
    BigDecimal fixedFeeBD = new BigDecimal(fixedFee);

    return amountBD.add(fixedFeeBD).divide(percentageFeeBD, 10, BigDecimal.ROUND_UP)
            .setScale(2, BigDecimal.ROUND_UP).floatValue();
}

2 个答案:

答案 0 :(得分:4)

每当你处理钱时,你都会想要使用精确数据类型而不是浮点数学。一般来说,在处理销售税等问题时,有关于如何处理问题的规则。

BigDecimal有一些参数可以设置来控制舍入行为,这可能会让你到达你需要去的地方。在任何情况下,这样的数学都不会精确到一分钱,但你应该能够保证你从不收取超过一分钱的额外部分。

答案 1 :(得分:2)

amt_you_receive = amt_customer_pays - .029 * amt_customer_pays - .30
amt_you_receive + .30 = amt_customer_pays * (1 - .029)
(amt_you_receive + .30) / .971 = amt_customer_pays

所以取你想要的金额,加30美分,除以.971(又乘以约1.029866),得到你应该收取的金额。