2009-08-12 64 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

应该'$ payment'是什么,如果'$ balance'是5? – 2009-08-12 23:32:36

+0

好点。我的回答:直到客户告诉我如何将支付(上涨或下跌)调整到最接近的百分比。在这个具体的情况下,我想下定决心不要滥收费用。 – 2009-08-13 02:26:53

+0

@Larry K,在这种情况下,使用[格雷格Hewgill的解决方案](http://stackoverflow.com/questions/1269133/perl-technique-for-money-calculations/1269182#1269182) – 2009-08-13 02:33:00

回答

7

参见Math::Currency

更新时间:

假设加起来的平衡是可取的所有款项,我想出了基于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; 
} 

输出:

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

谢谢。我会用数学::货币去。 – 2009-08-13 02:32:01

10

一种常用的方法是做所有的计算中整数美分,然后转换成美元和美分输出。因此,您的10美元余额将由1000(美分)表示,除以3表示333美元,即3.33美元。

但是,如果您希望以10美元的付款除以3,您将需要某种方式才能以3.33美元,3.33美元和美元3.34美元付款。这将取决于您的应用程序逻辑和业务规则,而不是您的语言的算术功能。

+0

+1是的,在过去,我使用过这种技术。我想看看这些天有没有更好的东西。数学::货币看起来不错。 – 2009-08-13 02:30:52

0

use Math :: Currency;

不重新发明轮子是一件好事:)

相关问题