3

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

特に:以下が機能する必要があります:

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

3 に答える 3

10

一般的な手法の 1 つは、すべての計算を整数セントで行い、出力のためにドルとセントに変換することです。したがって、$10 の残高は 1000 (セント) で表され、3 で割ると 333、つまり $3.33 になります。

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

于 2009-08-12T22:57:59.397 に答える
8

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

更新しました:

残高に加算されるすべての支払いが望ましいと仮定すると、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
于 2009-08-12T22:58:18.273 に答える
0

Math::Currency を使用します。

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

于 2009-09-26T03:07:17.120 に答える