Calcul des frais de transaction en Java


Disons que vous avez un site Web qui maintient l'équilibre pour chaque utilisateur. Vous donnez à chaque utilisateur la possibilité de déposer de l'argent dans son solde de PayPal, Amazon FPS, Authorize.NET eCheck et carte de crédit et peut-être deux là-bas une fois.

Chacune des sociétés ci-dessus facture des frais. Et puisque vous êtes le destinataire, vous êtes responsable des frais (à l'exception de l'API PayPal adaptative, vous pouvez dire qui paiera les frais).

Disons donc que l'utilisateur du site Web (expéditeur) vous déposera $1000.00 Et vous permet de sélecteur frais de 2,9% plus 0,30 fix frais fixes = - 29,30$ Ainsi, le destinataire (le propriétaire du site Web) se retrouve avec 9 970.70

Si vous essayez de facturer $1029.30 vous vous retrouvez avec 9 999.1503 Si vous essayez de facturer $1031.11 vous vous retrouvez avec $1000.90781 ce qui est acceptable (c'est lorsque les frais sont augmentés de 0.181% à 3.081% + 0.30)

Donc, cette question est, quelle est la meilleure façon de calculer le 0.181% dans la méthode Java

Je sais que c'est plus un problème mathématique qu'un problème Java mais quel serait le meilleur algorithme à utiliser pour deviner le meilleur pourcentage de frais afin que la valeur finale soit aussi proche que possible de la valeur finale de ce que l'utilisateur du site Web essaie de déposer.

Donc, la méthode devrait prendre les frais réels 2.9% (0.029 pour la multiplication), les frais fixes 0.30 le montant que l'utilisateur essaie de déposer et de déterminer la somme finale à facturer qui serait aussi proche que possible du montant du dépôt.

La façon dont je l'ai fait essaie d'augmenter le 2.9% jusqu'à ce que je frappe légèrement plus élevé après soustraction des frais.

MISE À JOUR

Selon les réponses ci-dessous, j'ai codé cette méthode. Toute autre suggestion est plus que bienvenue:

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();
}
Author: easwee, 2011-03-07

2 answers

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

Prenez donc le montant que vous souhaitez obtenir, ajoutez 30 cents et divisez par .971 (aka multiplier par environ 1.029866) pour obtenir le montant que vous devez facturer.

 2
Author: Yuliy, 2011-03-07 00:42:41

Chaque fois que vous avez affaire à de l'argent, vous voudrez utiliser un type de données de précision plutôt que des mathématiques à virgule flottante. En général, il y a des règles sur la façon dont vous arrondir sur les questions lorsque vous traitez avec des choses comme la taxe de vente.

BigDecimal a des paramètres que vous pouvez définir pour contrôler le comportement d'arrondi qui vous amènera probablement là où vous devez aller. Dans tous les cas comme celui ci le calcul ne sera jamais exact sur des fractions de cent mais vous devriez être en mesure de garantir que vous ne factureriez jamais plus de une fraction supplémentaire d'un sou.

 4
Author: Jeremy, 2011-03-07 02:01:11