2009-08-12 7 views
3

Was ist die beste Technik für den Umgang mit US-Dollar Berechnungen in Perl?Was ist die beste Technik für den Umgang mit US-Dollar-Berechnungen in Perl?

Vor allem: die folgenden Anforderungen zu arbeiten:

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

Was soll '$ Zahlung' sein, wenn '$ balance' 5? –

+0

Guter Punkt. Meine Antwort: Bis der Kunde mir sagt, wie man die Zahlungen auf den nächsten Cent (auf oder ab) runden soll. In diesem speziellen Fall möchte ich abgerundet werden, um sicher zu sein, nicht überladen. –

+0

@Larry K, in diesem Fall, verwenden [Greg Hewgill Lösung] (http://stackoverflow.com/questions/1269133/perl-technique-for-money-calculations/1269182#1269182) –

Antwort

7

Siehe Math::Currency.

Aktualisiert:

alle Zahlungen Unter der Annahme, Hinzufügen von bis zu dem Rest ist wünschenswert, kam ich mit dem folgende Skript bis basierend auf the points made by 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; 
} 

Ausgang:

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 
+0

Danke. Ich werde mit Math :: Currency gehen. –

10

Eine übliche Technik ist für die Ausgabe zu tun konvertiert alle Berechnungen in integer Cent, dann auf Dollar und Cent. Ihr $ 10-Guthaben würde also durch 1000 (Cent) repräsentiert, und das Teilen durch drei ergibt 333 oder $ 3,33.

Wenn Sie jedoch eine Zahlung von $ 10 durch drei teilen möchten, benötigen Sie eine Möglichkeit, mit Zahlungen von $ 3,33, $ 3,33 und $ 3,34 enden. Dies hängt mehr von Ihrer Anwendungslogik und Ihren Geschäftsregeln ab als die arithmetischen Funktionen Ihrer Sprache.

+0

Eine gute Sache wäre auch, die Details entweder mit den Anwälten (wenn es die eigene Firma ist) zu hashen - also tragen die richtigen user-facing-Vereinbarungen dies in den Kleinbuchstaben; oder um sicherzustellen, dass diese Details in den Produktanforderungsdokumenten sehr klar angegeben sind, wenn es sich um eine Auftragsarbeit handelt. Vermutungen in diesem Bereich sind gefährlich. Aus irgendeinem seltsamen Grund neigen Leute dazu, sensibel zu sein. –

+0

+1 Ja, in der Vergangenheit habe ich diese Technik verwendet. Ich wollte sehen, ob es heutzutage etwas Besseres gibt. Math :: Währung sieht gut aus. –

0

Verwenden Sie Math :: Currency;

nicht das Rad neu zu erfinden, ist eine gute Sache :)

Verwandte Themen