NAME
App::CalcAccumulatedDiscounts - Calculate multi-year discounts from a per-year discount rate
VERSION
This document describes version 0.080 of App::CalcAccumulatedDiscounts (from Perl distribution App-CalcAccumulatedDiscounts), released on 2021-07-17.
SYNOPSIS
See the included script calc-accumulated-discounts.
FUNCTIONS
calc_accumulated_discounts
Usage:
calc_accumulated_discounts(
%args
) -> [
$status_code
,
$reason
,
$payload
, \
%result_meta
]
Calculate multi-year discounts from a per-year discount rate.
Examples:
Example #1:
calc_accumulated_discounts();
Result:
[
200,
"OK"
,
[
[
"Disc p.a. \\ Year"
,
"5y"
,
"10y"
,
"15y"
,
"20y"
,
"25y"
,
"30y"
,
"35y"
,
"40y"
,
"45y"
,
"50y"
,
],
[
"0.25%"
,
"1.2%"
,
"2.5%"
,
"3.7%"
,
"4.9%"
,
"6.1%"
,
"7.2%"
,
"8.4%"
,
"9.5%"
,
"10.7%"
,
"11.8%"
,
],
[
"0.50%"
,
"2.5%"
,
"4.9%"
,
"7.2%"
,
"9.5%"
,
"11.8%"
,
"14.0%"
,
"16.1%"
,
"18.2%"
,
"20.2%"
,
"22.2%"
,
],
[
"0.75%"
,
"3.7%"
,
"7.3%"
,
"10.7%"
,
"14.0%"
,
"17.2%"
,
"20.2%"
,
"23.2%"
,
"26.0%"
,
"28.7%"
,
"31.4%"
,
],
[
"1.00%"
,
"4.9%"
,
"9.6%"
,
"14.0%"
,
"18.2%"
,
"22.2%"
,
"26.0%"
,
"29.7%"
,
"33.1%"
,
"36.4%"
,
"39.5%"
,
],
[
"1.25%"
,
"6.1%"
,
"11.8%"
,
"17.2%"
,
"22.2%"
,
"27.0%"
,
"31.4%"
,
"35.6%"
,
"39.5%"
,
"43.2%"
,
"46.7%"
,
],
[
"1.50%"
,
"7.3%"
,
"14.0%"
,
"20.3%"
,
"26.1%"
,
"31.5%"
,
"36.5%"
,
"41.1%"
,
"45.4%"
,
"49.3%"
,
"53.0%"
,
],
[
"1.75%"
,
"8.4%"
,
"16.2%"
,
"23.3%"
,
"29.7%"
,
"35.7%"
,
"41.1%"
,
"46.1%"
,
"50.6%"
,
"54.8%"
,
"58.6%"
,
],
[
"2.00%"
,
"9.6%"
,
"18.3%"
,
"26.1%"
,
"33.2%"
,
"39.7%"
,
"45.5%"
,
"50.7%"
,
"55.4%"
,
"59.7%"
,
"63.6%"
,
],
[
"2.25%"
,
"10.8%"
,
"20.4%"
,
"28.9%"
,
"36.6%"
,
"43.4%"
,
"49.5%"
,
"54.9%"
,
"59.8%"
,
"64.1%"
,
"67.9%"
,
],
[
"2.50%"
,
"11.9%"
,
"22.4%"
,
"31.6%"
,
"39.7%"
,
"46.9%"
,
"53.2%"
,
"58.8%"
,
"63.7%"
,
"68.0%"
,
"71.8%"
,
],
[
"2.75%"
,
"13.0%"
,
"24.3%"
,
"34.2%"
,
"42.7%"
,
"50.2%"
,
"56.7%"
,
"62.3%"
,
"67.2%"
,
"71.5%"
,
"75.2%"
,
],
[
"3.00%"
,
"14.1%"
,
"26.3%"
,
"36.7%"
,
"45.6%"
,
"53.3%"
,
"59.9%"
,
"65.6%"
,
"70.4%"
,
"74.6%"
,
"78.2%"
,
],
[
"3.25%"
,
"15.2%"
,
"28.1%"
,
"39.1%"
,
"48.4%"
,
"56.2%"
,
"62.9%"
,
"68.5%"
,
"73.3%"
,
"77.4%"
,
"80.8%"
,
],
[
"3.50%"
,
"16.3%"
,
"30.0%"
,
"41.4%"
,
"51.0%"
,
"59.0%"
,
"65.7%"
,
"71.3%"
,
"76.0%"
,
"79.9%"
,
"83.2%"
,
],
[
"3.75%"
,
"17.4%"
,
"31.8%"
,
"43.6%"
,
"53.4%"
,
"61.5%"
,
"68.2%"
,
"73.8%"
,
"78.3%"
,
"82.1%"
,
"85.2%"
,
],
[
"4.00%"
,
"18.5%"
,
"33.5%"
,
"45.8%"
,
"55.8%"
,
"64.0%"
,
"70.6%"
,
"76.0%"
,
"80.5%"
,
"84.1%"
,
"87.0%"
,
],
[
"4.50%"
,
"20.6%"
,
"36.9%"
,
"49.9%"
,
"60.2%"
,
"68.4%"
,
"74.9%"
,
"80.0%"
,
"84.1%"
,
"87.4%"
,
"90.0%"
,
],
[
"5.00%"
,
"22.6%"
,
"40.1%"
,
"53.7%"
,
"64.2%"
,
"72.3%"
,
"78.5%"
,
"83.4%"
,
"87.1%"
,
"90.1%"
,
"92.3%"
,
],
],
{
"table.field_aligns"
=> [
"number"
,
"number"
,
"number"
,
"number"
,
"number"
,
"number"
,
"number"
,
"number"
,
"number"
,
"number"
,
"number"
,
],
},
]
Modify years and discount rates to generate:
calc_accumulated_discounts(
discounts
=> [1, 2, 2.5],
years
=> [5, 10]);
Result:
[
200,
"OK"
,
[
[
"Disc p.a. \\ Year"
,
"5y"
,
"10y"
],
[
"1.00%"
,
"4.9%"
,
"9.6%"
],
[
"2.00%"
,
"9.6%"
,
"18.3%"
],
[
"2.50%"
,
"11.9%"
,
"22.4%"
],
],
{
"table.field_aligns"
=> [
"number"
,
"number"
,
"number"
] },
]
This routine generates a table of accumulated discounts over a period of several years, given the annual discount rates.
I first wrote this to see the accumulated fees when choosing mutual funds products. The moral of the story is, if you plan to hold a fund for a long time (e.g. 5-10 years or longer) you should pick funds that are low in annual fees (e.g. 1% or lower). Otherwise, the annual management fees will eat up most, if not all, your potential profits.
This function is not exported.
Arguments ('*' denotes required arguments):
discounts => array[float] (default: [0.25,0.5,0.75,1,1.25,1.5,1.75,2,2.25,2.5,2.75,3,3.25,3.5,3.75,4,4.5,5])
years => array[int] (default: [5,10,15,20,25,30,35,40,45,50])
Returns an enveloped result (an array).
First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.
Return value: (any)
HOMEPAGE
Please visit the project's homepage at https://metacpan.org/release/App-CalcAccumulatedDiscounts.
SOURCE
Source repository is at https://github.com/perlancar/perl-App-CalcAccumulatedDiscounts.
BUGS
Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=App-CalcAccumulatedDiscounts
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
AUTHOR
perlancar <perlancar@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2021, 2017, 2015 by perlancar@cpan.org.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.