【问题标题】:Objective C Math Formula FailObjective C 数学公式失败
【发布时间】:2010-08-06 21:41:18
【问题描述】:

这里的菜鸟想在 iPhone 上计算复利。

float principal;
float rate;
int compoundPerYear;
int years;
float amount;

公式应为:金额 = 本金*(1+rate/compoundPerYear)^(rate*years)

我得到的答案有点不正确:

amount = principal*pow((1+(rate/compoundPerYear)), (compoundPerYear*years));

我正在以 0.1 的速率对其进行测试,但调试器报告为 .100000001。

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

感谢您提出任何其他想法!


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

【问题讨论】:

标签: objective-c math double finance floating-accuracy


【解决方案1】:

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

如果你真的有兴趣,可以看看What Every Computer Scientist Should Know About Floating-Point Arithmetic。链接可耻地从另一个 SO 线程中窃取。

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

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

另见:

和其他类似的线程。


我在下班开车回家时考虑的进一步扩展:可以想象的一种处理方法是仅以美分表示所有货币值(作为 int),然后在显示时转换为 $.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 示例也有意义。同样,这只是处理它的一种方法。它还可以通过在需要显示数据时进行字符串格式化的函数来改进。

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

【讨论】:

  • 它可以工作,是的。主要优点是您需要担心的浮点数减少了。即使您使用 NSDecimalNumber 来表示汇率,最终将货币值保留为美分可能会更容易。然后,您可以尽可能执行整数运算(例如将两笔钱加在一起)。如果 NSDecimalNumber 对您的计算来说足够精确,那么使用它是非常有意义的。再说一次,我不是一个 Objective-C 的人 :)
  • 恕我直言,会计和浮点数只有在非常谨慎和考虑的情况下才能混合。我的理解是,已经建立了最佳实践,了解它们并遵循它们将是一个好主意。一个好的第一步是从美分而不是美元开始工作。如果您仍然需要浮点值类型,那么切换到以 10 为基数而不是以 2 为基数的浮点值类型会有所帮助。这只是非常大问题的冰山一角。
【解决方案2】:

简答:永远不要用浮点数来赚钱。

适用于大多数平台的简单方法是将货币表示为其最小单位的整数。最小的单位通常是美分,尽管通常 1/10 或 1/100 美分是真正的基本单位。

在许多平台上,也有可以表示定点小数的数字类型。

确保四舍五入正确。财务簿记经常使用银行家的四舍五入。

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多