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
Was soll '$ Zahlung' sein, wenn '$ balance' 5? –
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. –
@Larry K, in diesem Fall, verwenden [Greg Hewgill Lösung] (http://stackoverflow.com/questions/1269133/perl-technique-for-money-calculations/1269182#1269182) –