logisheets_controller/calc_engine/calculator/math/
npv.rs

1pub fn calc_npv(rate: f64, values: &[f64]) -> f64 {
2    if rate == 0.0 {
3        return values.iter().sum();
4    }
5    let result = values.iter().enumerate().fold(0_f64, |prev, (idx, value)| {
6        let r = (1. + rate).powi(1 + idx as i32);
7        value / r + prev
8    });
9    result
10}
11
12#[cfg(test)]
13mod tests {
14    use super::calc_npv;
15
16    #[test]
17    fn npv_test() {
18        let cf = [-1000., 500., 500., 500.];
19        let rate = 0.1;
20        assert_eq!(calc_npv(rate, &cf), 221.29635953828273)
21    }
22
23    #[test]
24    fn npv_test2() {
25        let cf = [-1000., 500., 500., 500.];
26        let rate = 0_f64;
27        assert_eq!(calc_npv(rate, &cf), 500.)
28    }
29}