代码之家  ›  专栏  ›  技术社区  ›  Larry K

用Perl处理美元计算的最佳技术是什么?

  •  3
  • Larry K  · 技术社区  · 15 年前

    用Perl处理美元计算的最佳技术是什么?

    特别是:以下需要工作:

    $balance = 10;
    $payment = $balance / 3; # Each payment should be 3.33. How best to round amount?
    $balance -= $payment * 3;
    # assert: $balance == .01
    
    3 回复  |  直到 15 年前
        1
  •  7
  •   Community CDub    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
    
        2
  •  10
  •   Greg Hewgill    15 年前

    一种常见的技术是在 整数美分 ,然后转换成美元和美分作为输出。所以你的10美元余额用1000(美分)来表示,除以3等于333,即3.33美元。

    但是,如果你想将10美元的付款除以3,你将需要某种方式以3.33美元、3.33美元和 3.34美元 . 这将更多地取决于应用程序逻辑和业务规则,而不是语言的算术特性。

        3
  •  0
  •       15 年前

    使用数学:货币;

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

    推荐文章