From 38023d3156002a38c3b106dcec32c65c057b7846 Mon Sep 17 00:00:00 2001 From: Steve Fanning Date: Mon, 23 Dec 2024 20:30:31 +0000 Subject: [PATCH] Include PV function description --- docs/src/functions/financial.md | 2 +- docs/src/functions/financial/fv.md | 4 +- docs/src/functions/financial/pv.md | 58 ++++++++++++++++++++++++++--- xlsx/tests/docs/PV.xlsx | Bin 9998 -> 11005 bytes 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/docs/src/functions/financial.md b/docs/src/functions/financial.md index 153011d..e8593cd 100644 --- a/docs/src/functions/financial.md +++ b/docs/src/functions/financial.md @@ -51,7 +51,7 @@ You can track the progress in this [GitHub issue](https://github.com/ironcalc/Ir | PRICE | | – | | PRICEDISC | | – | | PRICEMAT | | – | -| PV | | – | +| PV | | [PV](financial/pv) | | RATE | | – | | RECEIVED | | – | | RRI | | - | diff --git a/docs/src/functions/financial/fv.md b/docs/src/functions/financial/fv.md index 36d6303..0d4e974 100644 --- a/docs/src/functions/financial/fv.md +++ b/docs/src/functions/financial/fv.md @@ -21,7 +21,7 @@ If your interest rate varies between periods, use the [FVSCHEDULE](/functions/fi * *nper* ([number](/features/value-types#numbers), required). "nper" stands for number of periods, in this case the number of compounding periods to be taken into account. While this will often be an integer, non-integer values are accepted and processed. * *pmt* ([number](/features/value-types#numbers), required). "pmt" stands for payment, in this case the fixed amount paid or deposited each compounding period. * *pv* ([number](/features/value-types#numbers), [optional](/features/optional-arguments.md)). "pv" is the present value or starting amount of the asset (default 0). -* *type* ([boolean](/features/value-types/#booleans), [optional](/features/optional-arguments.md)). A logical value indicating whether the payment due dates are at the end (FALSE or 0) of the compounding periods or at the beginning (TRUE or any non-zero value). The default is FALSE when omitted. +* *type* ([Boolean](/features/value-types/#booleans), [optional](/features/optional-arguments.md)). A logical value indicating whether the payment due dates are at the end (FALSE or 0) of the compounding periods or at the beginning (TRUE or any non-zero value). The default is FALSE when omitted. ### Additional guidance * Make sure that the *rate* argument specifies the interest rate or yield applicable to the compounding period, based on the value chosen for *nper*. * The *pmt* and *pv* arguments should be expressed in the same currency unit. @@ -32,7 +32,7 @@ FV returns a [number](/features/value-types/#numbers) representing the future va ### Error conditions * In common with many other IronCalc functions, FV propagates errors that are found in any of its arguments. * If too few or too many arguments are supplied, FV returns the [`#ERROR!`](/features/error-types.md#error) error. -* If the value of any of the *rate*, *nper*, *pmt* or *pv* arguments is not (or cannot be converted to) a [number](/features/value-types#value), then FV returns the [`#VALUE!`](/features/error-types.md#value) error. +* If the value of any of the *rate*, *nper*, *pmt* or *pv* arguments is not (or cannot be converted to) a [number](/features/value-types#numbers), then FV returns the [`#VALUE!`](/features/error-types.md#value) error. * If the value of the *type* argument is not (or cannot be converted to) a [Boolean](/features/value-types#booleans), then FV again returns the [`#VALUE!`](/features/error-types.md#value) error. * For some combinations of valid argument values, FV may return a [`#NUM!`](/features/error-types.md#num) error or a [`#DIV/0!`](/features/error-types.md#div-0) error. diff --git a/docs/src/functions/financial/pv.md b/docs/src/functions/financial/pv.md index 0bc9f07..b347da2 100644 --- a/docs/src/functions/financial/pv.md +++ b/docs/src/functions/financial/pv.md @@ -3,9 +3,57 @@ layout: doc outline: deep lang: en-US --- - -# PV - +# PV function ::: warning -🚧 This function is implemented but currently lacks detailed documentation. For guidance, you may refer to the equivalent functionality in [Microsoft Excel documentation](https://support.microsoft.com/en-us/office/excel-functions-by-category-5f91f4e9-7b42-46d2-9bd1-63f26a86c0eb). -::: \ No newline at end of file +**Note:** This draft page is under construction 🚧 +::: +## Overview +PV (Present Value) is a function of the Financial category that can be used to calculate the present value of a series of future cash flows. + +PV can be used to calculate present value over a specified number of compounding periods. A fixed interest rate or yield is assumed over all periods, and a fixed payment or deposit can be applied at the start or end of every period. +## Usage +### Syntax +**PV(rate, nper, pmt, fv=0, type=FALSE) => pv** +### Argument descriptions +* *rate* ([number](/features/value-types#numbers), required). The fixed percentage interest rate or yield per period. +* *nper* ([number](/features/value-types#numbers), required). "nper" stands for number of periods, in this case the number of compounding periods to be taken into account. While this will often be an integer, non-integer values are accepted and processed. +* *pmt* ([number](/features/value-types#numbers), required). "pmt" stands for payment, in this case the fixed amount paid or deposited each compounding period. +* *fv* ([number](/features/value-types#numbers), [optional](/features/optional-arguments.md)). "fv" is the future value at the end of the final compounding period (default 0). +* *type* ([Boolean](/features/value-types/#booleans), [optional](/features/optional-arguments.md)). A logical value indicating whether the payment due dates are at the end (FALSE or 0) of the compounding periods or at the beginning (TRUE or any non-zero value). The default is FALSE when omitted. +### Additional guidance +* Make sure that the *rate* argument specifies the interest rate or yield applicable to the compounding period, based on the value chosen for *nper*. +* The *pmt* and *fv* arguments should be expressed in the same currency unit. +* To ensure a worthwhile result, one of the *pmt* and *fv* arguments should be non-zero. +* The setting of the *type* argument only affects the calculation for non-zero values of the *pmt* argument. +### Returned value +PV returns a [number](/features/value-types/#numbers) representing the present value expressed in the same [currency unit](/features/units) that was used for the *pmt* and *fv* arguments. +### Error conditions +* In common with many other IronCalc functions, PV propagates errors that are found in any of its arguments. +* If too few or too many arguments are supplied, PV returns the [`#ERROR!`](/features/error-types.md#error) error. +* If the value of any of the *rate*, *nper*, *pmt* or *fv* arguments is not (or cannot be converted to) a [number](/features/value-types#numbers), then PV returns the [`#VALUE!`](/features/error-types.md#value) error. +* If the value of the *type* argument is not (or cannot be converted to) a [Boolean](/features/value-types#booleans), then PV again returns the [`#VALUE!`](/features/error-types.md#value) error. +* For some combinations of valid argument values, PV may return a [`#NUM!`](/features/error-types.md#num) error or a [`#DIV/0!`](/features/error-types.md#div-0) error. +In paticular, PV always returns a [`#DIV/0!`](/features/error-types.md#div-0) error if the value of the *rate* argument is set to -1. + + +## Details +* If $\text{type} \neq 0$, $\text{pv}$ is given by the equation: +$$ \text{pv} = - \Biggl(\dfrac{(\text{fv} \times \text{rate}) + \bigl(\text{pmt} \times (1+\text{rate})\times \bigl({(1+\text{rate})^{\text{nper}}-1\bigr)\bigr)}}{\text{rate} \times (1+\text{rate})^{\text{nper}}}\Biggl) +$$ + +* If $\text{type} = 0$, $\text{pv}$ is given by the equation: +$$ \text{pv} = - \Biggl(\dfrac{(\text{fv} \times \text{rate}) + \bigl(\text{pmt}\times \bigl({(1+\text{rate})^{\text{nper}}-1\bigr)\bigr)}}{\text{rate} \times (1+\text{rate})^\text{{nper}}}\Biggl) +$$ + +* For any $\text{type}$, in the special case of $\text{rate} = 0$, $\text{pv}$ is given by the equation: +$$ +\text{pv} = -\text{fv} - (\text{pmt} \times \text{nper}) +$$ +## Examples +[See some examples in IronCalc](https://app.ironcalc.com/?example=pv). + +## Links +* For more information about the concept of "present value" in finance, visit Wikipedia's [Present value](https://en.wikipedia.org/wiki/present_value) page. +* See also IronCalc's [FV](/functions/financial/fv), [NPER](/functions/financial/nper), [PMT](/functions/financial/pmt) and [RATE](/functions/financial/rate) functions. +* Visit Microsoft Excel's [PV function](https://support.microsoft.com/en-gb/office/pv-function-23879d31-0e02-4321-be01-da16e8168cbd) page. +* Both [Google Sheets](https://support.google.com/docs/answer/3093243) and [LibreOffice Calc](https://wiki.documentfoundation.org/Documentation/Calc_Functions/PV) provide versions of the PV function. \ No newline at end of file diff --git a/xlsx/tests/docs/PV.xlsx b/xlsx/tests/docs/PV.xlsx index b74c16911dcb1bb678ab1aa6a110d8037a0cedbb..8609ebb4561a18312dcc118f33abbaa4334f9bf5 100644 GIT binary patch delta 4985 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 delta 3962 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 a6qK3xk`tQ*eLx%l!cIZKWU{<}Q~wK{t8rlf