目标C数学公式失败

alr*_*der 2 math double finance objective-c floating-accuracy

诺布在这里想要计算iPhone的复利.

float principal;
float rate;
int compoundPerYear;
int years;
float amount;
Run Code Online (Sandbox Code Playgroud)

公式应为:amount = principal*(1 + rate/compoundPerYear)^(rate*years)

我得到的答案略有错误:

amount = principal*pow((1+(rate/compoundPerYear)), (compoundPerYear*years));
Run Code Online (Sandbox Code Playgroud)

我正在以.1的速率测试它,但调试器报告.100000001.

我做错了吗?我应该使用双打还是特殊课程(例如,NSNumber)?

感谢您的任何其他想法!


经过进一步的研究,似乎NSDecimalNumber类可能正是我所需要的.现在我只需要弄清楚如何使用这个坏男孩.

eld*_*his 6

double 会让你更接近,但你不能完全用二进制表示1/10(无论如何使用IEEE浮点表示法).

如果你真的很感兴趣,你可以看看每个计算机科学家应该知道的关于浮点运算的内容.链接从另一个SO线程可耻地被盗.

快速而肮脏的解释是浮点以二进制形式存储,其中的位表示分数幂2(1/2,1/4,1/8,...).没有数学方法可以将这些分数精确地加到1/10,因此0.1不能用IEEE浮点表示法精确表示.

double通过在基数之前/之后给出更多数字来扩展数字的准确性,但它不会以可以弥补这一点的方式改变二进制格式.你很可能会在以后的某个地方获得额外的一点.

也可以看看:

和其他类似的线程.


进一步扩展我在下班回家的工作中:你可以想象处理这种情况的一种方法是用美分(作为int)表示所有货币值,然后在显示数据时转换为dollar.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);
Run Code Online (Sandbox Code Playgroud)

我不知道Objective-C,但希望这个C例子也有意义.同样,这只是处理它的一种方法.它还可以通过在需要显示数据时使用函数执行字符串格式化来改进.

你显然可以拿出自己的(甚至更好!)方式来做到这一点,但也许这会帮助你入门.如果其他人对此有任何建议,我也想听听他们的意见!