logisheets_controller/calc_engine/calculator/math/
npv.rs1pub 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}