Quelle est la meilleure technique pour effectuer des calculs en dollars américains en Perl?

StackOverflow https://stackoverflow.com/questions/1269133

  •  13-09-2019
  •  | 
  •  

Question

Quelle est la meilleure technique pour effectuer des calculs en dollars américains en Perl?

En particulier: les besoins suivants au travail:

$balance = 10;
$payment = $balance / 3; # Each payment should be 3.33. How best to round amount?
$balance -= $payment * 3;
# assert: $balance == .01
Était-ce utile?

La solution

Voir Math :: Currency .

Mise à jour:

En supposant que tous les paiements en ajoutant jusqu'à l'équilibre est souhaitable, je suis venu avec le script suivant basé sur les points soulevés par Greg Hewgill :

#!/usr/bin/perl

use strict;
use warnings;

use List::Util qw( sum );

my @balances = (10, 1, .50, 5, 7, 12, 3, 2, 8, 1012);

for my $balance (@balances) {
    my @stream = get_payment_stream($balance, 3);
    my $sum = sum @stream;
    print "$balance : @stream : $sum\n";
}

sub get_payment_stream {
    my ($balance, $installments) = @_;
    $balance *= 100;
    my $payment = int($balance / $installments);
    $installments -= 1;
    my $residual = $balance - int($payment * $installments);
    my @stream = (($payment) x $installments, $residual);
    return map { sprintf '%.2f', $_ / 100} @stream;
}

Sortie:

C:\Temp> p
10 : 3.33 3.33 3.34 : 10
1 : 0.33 0.33 0.34 : 1
0.5 : 0.16 0.16 0.18 : 0.5
5 : 1.66 1.66 1.68 : 5
7 : 2.33 2.33 2.34 : 7
12 : 4.00 4.00 4.00 : 12
3 : 1.00 1.00 1.00 : 3
2 : 0.66 0.66 0.68 : 2
8 : 2.66 2.66 2.68 : 8
1012 : 337.33 337.33 337.34 : 1012

Autres conseils

Une technique courante consiste à faire tous les calculs en cents entiers , puis convertir en dollars et en cents pour la sortie. Ainsi, votre solde de 10 $ serait représenté par 1000 (cents), et en divisant par trois donne 333, ou 3,33 $.

Cependant, si vous voulez diviser un paiement de 10 $ par trois, vous aurez besoin d'un moyen de mettre fin avec les paiements de 3,33 $, 3,33 $, et 3,34 $ . Ce sera plus à votre logique et l'application des règles métier que les caractéristiques arithmétiques de votre langue.

utiliser Math :: Monnaie;

Ne pas réinventer la roue est une bonne chose:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top