数学,在日常生活中出了买菜之外,还能发挥很大的作用。笔者的一个朋友在朋友圈发布了一条保险的广告:
简单的说:连续三年每年存3万,然后第八年就能够取出来 111,659元。根据他们的说法,第八年的收益是 21,659元,因此利息是:(21659/90000)=24.1%,这算得每年利息 24.1%/7=3.45% (我也不知道为什么他们要除以7 )。从直觉上看我感觉这个非常可疑,按照复利计算得年利率应该不高。于是动笔进行计算。
假设年利率为x,那么一年之后本金加利率为 p=1+x。
第一年末尾一共有: 3*p
第二年末尾一共有: (3*p+3)*p
第三年末尾一共有: ((3*p+3)*p+3)*p
第四年末尾一共有: ((3*p+3)*p+3)*(p^2)
……………………………………….
第八年末尾一共有: ((3*p+3)*p+3)*(p^6)
第N年末尾一共有: ((3*p+3)*p+3)*(p^(N-2))
针对第八年进行研究,展开算式一共有 3*(P^8) +3*(P^7) +3*(P^6), 对照上面表格有方程
3*(P^8) +3*(P^7) +3*(P^6)= 111659
这是一元八次方程,我没有办法直接从数学角度解开。于是编写代码来解。因为我们知道这是一个单调递增函数,所以我们可以给定一个初始值Start,然后给出一个步长 Step,不断尝试计算f(Start+Step)的值,如果它小于目标,那么 Start=Start+Step,否则 Step=Step/2 继续尝试。最终得到一个值: 1.03123863220215
换句话说,以复利计算年利率 3.123%。
之后,我们再使用20年的收益168703进行计算,结果是:1.03360308647156。以复利计算年利率 3.36%。
C#编写的完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace ConsoleApplication31
{
class Program
{
static double f(double value,int year)
{
return Math.Pow(value, year) + Math.Pow(value, year-1) + Math.Pow(value, year-2);
}
static void Main(string[] args)
{
const double ESP = 1e-6;
const int YEAR = 8;
double start = 1.00;
double step = 0.01;
double target = 111659.00 / 30000;
for (int i = 0; i < 1000; i++)
{
if (Math.Abs(f(start, YEAR) - target) <ESP)
{
Console.WriteLine("Target: {0}", start);
break;
}
// 增加之后 f(x) 大于 target
if (f(start + step, YEAR) > target)
{
step = step / 2;
}
else {
start += step;
}
Console.WriteLine("{0}:{1} {2}", i, f(start, YEAR), start);
}
Console.ReadKey();
}
}
}
从上面可以看出:在查看这种收益表格时,因为计算复杂,消费者很容易被误导。另外,这种产品周期太长,风险很大,是另外的成本。