Каков наилучший метод обработки вычислений в долларах США в Perl?
-
13-09-2019 - |
Вопрос
Каков наилучший метод обработки вычислений в долларах США в Perl?
Особенно:необходимо следующее:
$balance = 10;
$payment = $balance / 3; # Each payment should be 3.33. How best to round amount?
$balance -= $payment * 3;
# assert: $balance == .01
Решение
Видеть Математика::Валюта.
Обновлено:
Предполагая, что желательно, чтобы все платежи добавляли баланс, я придумал следующий сценарий, основанный на моменты, высказанные Грегом Хьюгиллом:
#!/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
Другие советы
Одним из распространенных методов является выполнение всех вычислений в целые центы, затем конвертируйте в доллары и центы для вывода.Таким образом, ваш баланс в 10 долларов будет представлен 1000 (центами), а деление на три даст 333, или 3,33 доллара.
Однако если вы хотите разделить платеж в размере 10 долларов на три, вам понадобится какой-то способ получить выплаты в размере 3,33 доллара, 3,33 доллара и 3,33 доллара. $3.34.Это будет больше зависеть от логики вашего приложения и бизнес-правил, чем от арифметических возможностей вашего языка.
используйте Math::Currency;
Не изобретать велосипед - это хорошо :)