objective-c - Objective C 数学公式失败

标签 objective-c math double finance floating-accuracy

菜鸟想在 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 通过在基数之前/之后为您提供更多数字来扩展数字的准确性,但它不会以可以弥补这一点的方式更改二进制格式。您很可能会在稍后的某个地方获得额外的部分。

另见:

和其他类似的主题。


我在下类回家的路上仔细考虑的进一步扩展:可以想到的一种处理方法是仅以美分表示所有货币值(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/

相关文章:

java - 如何在 Java 中保留 n 位小数

iphone - 如何让 uinavigationbar 后退按钮返回到另一个 View Controller

iOS 如何获取注解选择的索引?

objective-c - 在 'strong' 之前需要一个 property 属性

java - 如何舍入浮点精度,考虑它的大小?

c++ - C++程序奇怪输出的原因

ios - AVFoundation AVAudioPlayer 停止暂停 - Objective-C

math - 透视投影,4分

c++ - 射线界平面相交

python - 创建字节范围(用于请求部分数据)