2009-08-12 22 views
3

Perlで米ドル計算を処理するための最良の方法は何ですか?特にPerlで米ドル計算を処理するための最良の方法は何ですか?

:以下が動作する必要があります。

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

'$ balance'は' $ balance'が5の場合はどうすればよいですか? –

+0

良い点。私の答え:クライアントまで、最も近いセントに支払いを(上または下に)丸める方法を教えてください。この特定のケースでは、私は過充電しないように丸めたいと思います。 –

+0

@ラリーK、その場合、[Greg Hewgillのソリューション]を使用してください(http://stackoverflow.com/questions/1269133/perl-technique-for-money-calculations/1269182#1269182) –

答えて

7

Math::Currencyを参照してください。

更新日:

#!/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; 
} 

出力:

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 
バランスが望まれるまで加えるすべての支払いを想定し

は、私がthe points made by Greg Hewgillに基づいて、次のスクリプトを思い付きました

+0

ありがとうございます。私はMath :: Currencyと一緒に行きます。 –

10

1つの一般的な技術は、出力のためのドルとセントに変換し、その後、整数セントですべての計算を行うことです。だから、あなたの10ドルの残高は1000セントで表され、3で割ると333、つまり3.33ドルとなります。

$ 10の支払いを3で割った場合、$ 3.33、$ 3.33、および$ 3.34の支払いになる方法が必要です。これは、自分の言語の算術機能よりも、アプリケーションのロジックやビジネスルールに依存します。

+0

弁護士と一緒に(自分の会社ならば)詳細を明らかにすることも良いことです。そうすれば、適切なユーザー対応契約でこれを小文字にすることができます。これが契約作業であれば、これらの詳細が製品要件文書に非常に明確に記されていることを確認することができます。この分野で前提を作ることは危険です。いくつかの奇妙な理由のために、人々はそれについて敏感である傾向があります。 –

+0

+1これまで、私はこの技術を使ってきました。私は最近、何か良いことがあるかどうかを見たいと思っていました。数学::通貨は良く見えます。 –

0

使用Math :: Currency;

車輪を再発明しないと良いことです:)

関連する問題