2009-08-12 2 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'가 5 일 경우 어떻게해야합니까? –

+0

좋은 지적. 내 대답 : 클라이언트에게 가장 가까운 센트로 지불을 (위 또는 아래로) 반올림하는 방법을 알려줍니다. 이 특별한 경우에 나는 과대하지 않도록 절주하고 싶습니다. –

+0

@Larry 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

한 가지 일반적인 기술은, 정수 센트의 모든 계산을 한 후 출력 달러와 센트 변환하는 것입니다. 따라서 $ 10 잔액은 1000 (센트)로 표시되고 3으로 나누면 333 ($ 3.33)이됩니다.

그러나 10 달러를 3로 나누려면 $ 3.33, $ 3.33 및 $ 3.34의 결제 방법이 필요합니다. 이는 언어의 산술 기능보다 애플리케이션 로직 및 비즈니스 규칙에 달려 있습니다.

+0

좋은 점은 변호사와 함께 세부 사항을 해싱하는 것입니다 (자신의 회사 인 경우). 적절한 사용자 대면 계약은이를 작은 글자로 나타냅니다. 이것이 계약 업무 인 경우 제품 세부 사항 문서에서 이러한 세부 사항을 매우 분명하게 설명해야합니다. 이 영역에서 가정을하는 것은 위험합니다. 어떤 이상한 이유 때문에 사람들은 그것에 대해 민감한 경향이 있습니다. –

+0

+1 예, 과거에는이 기법을 사용했습니다. 요즘에는 더 나은 것이 있는지 알고 싶었습니다. 수학 : 통화가 좋아 보인다. –

0

사용 Math :: Currency;

휠을 다시 발명하지 않으면 좋은 것입니다.

관련 문제