菜鸟想在 iPhone 上计算复利。
float principal;
float rate;
int compoundPerYear;
int years;
float amount;
公式应该是:金额=本金*(1+费率/每年的化合物)^(费率*年)
我得到的答案有点不正确:
amount = principal*pow((1+(rate/compoundPerYear)), (compoundPerYear*years));
我正在以 .1 的速率对其进行测试,但调试器报告 .100000001。
我做错了吗?我应该使用 double 还是特殊类别(例如,NSNumber)?
感谢任何其他想法!
经过进一步研究,NSDecimalNumber 类似乎正是我所需要的。现在我只需要弄清楚如何使用这个坏男孩。
最佳答案
double
会让你更接近,但你不能用二进制精确表示 1/10(无论如何使用 IEEE 浮点表示法)。
如果你真的有兴趣可以看看What Every Computer Scientist Should Know About Floating-Point Arithmetic .可耻地从另一个 SO 线程中窃取了链接。
简单粗暴的解释是, float 以二进制形式存储,其中的位表示 2 的小数次方(1/2、1/4、1/8、...)。根本没有数学方法可以将这些分数加起来正好等于 1/10,因此 0.1 无法用 IEEE 浮点表示法精确表示。
double
通过在基数之前/之后为您提供更多数字来扩展数字的准确性,但它不会以可以弥补这一点的方式更改二进制格式。您很可能会在稍后的某个地方获得额外的部分。
另见:
- Why can’t decimal numbers be represented exactly in binary?
- What’s wrong with using == to compare floats in Java?
和其他类似的主题。
我在下类回家的路上仔细考虑的进一步扩展:可以想到的一种处理方法是仅以美分表示所有货币值(value)(作为 int),然后在显示时转换为 dollars.cents 格式数据。这实际上也很简单,因为您可以在转换时利用整数除法的截断:
int interest, dollars, cents;
interest = 16034; //$160.34, in cents
dollars = value / 100; //The 34 gets truncated: dollars == 160
cents = value % 100; //cents == 34
printf("Interest earned to date: $%d.%d\n", dollars, cents);
我不了解 Objective-C,但希望这个 C 示例也有意义。同样,这只是处理它的一种方法。每当您需要显示数据时,只要有一个函数就可以进行字符串格式化,它也会得到改进。
您显然可以想出自己的(甚至更好!)方法来做到这一点,但这也许会帮助您入门。如果其他人对此有任何建议,我也很想听听他们的意见!
关于objective-c - Objective C 数学公式失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3427992/