Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java计算交易费用_Java_Math - Fatal编程技术网

用Java计算交易费用

用Java计算交易费用,java,math,Java,Math,假设你有一个为每个用户保持平衡的网站。您可以让每个用户选择从PayPal、Amazon FPS、Authorization.NET eCheck和信用卡将钱存入他们的余额中,可能还有一次 上述每家公司均收取费用。既然你是接收者,你就要承担费用(除了AdaptivePayPalAPI,你可以说谁来支付费用) 所以,假设网站用户(发送者)将向您存款1000.00美元 让选取者支付2.9%的费用加上$0.30的固定费用=-$29.30 因此,接收者(网站所有者)最终得到970.70美元 如果你试图收取

假设你有一个为每个用户保持平衡的网站。您可以让每个用户选择从PayPal、Amazon FPS、Authorization.NET eCheck和信用卡将钱存入他们的余额中,可能还有一次

上述每家公司均收取费用。既然你是接收者,你就要承担费用(除了AdaptivePayPalAPI,你可以说谁来支付费用)

所以,假设网站用户(发送者)将向您存款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();
}

因此,取你想要的金额,加上30美分,再除以.971(也就是说,乘以大约1.029866),得到你应该收取的金额。

任何时候你处理钱的时候,你都会希望使用精确数据类型,而不是浮点数。一般来说,在处理诸如销售税之类的问题时,有一些关于你如何处理问题的规则


BigDecimal具有一些参数,您可以设置这些参数来控制舍入行为,这些参数可能会使您到达需要的位置。在任何情况下,像这样的计算永远不会精确到一分钱的分数,但你应该能够保证你不会收取超过一分钱分数的额外费用。

你需要使用BigDecimal函数而不是/*+-运算符进行计算,以确保精度正确。@Mat Banik:应该是(金额+固定费用)/(1f-percentageFee),而不是amount/(1f percentageFee)+fixedFee。此外,您的测试用例是不正确的。如果您想查看amount X上的费用后剩下的内容,请选择X*.971-.3,而不是X*.971+.3。这是他们计算费用的方式,但要“反向”,您必须以不同的顺序执行操作,如答案中的方程式所示。
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