我应该使用NSDecimalNumber处理货币吗?

当我开始编写第一个应用程序的代码时,我使用NSNumber来获取货币值,而无需三思而后行。然后我认为也许c类型足以应付我的价值观。但是,由于其出色的舍入功能,在iPhone SDK论坛中建议我使用NSDecimalNumber。

我不是气质的数学家,我认为尾数/指数范式可能会过大。仍然,googlin,我意识到,关于可可中的金钱/货币的大多数讨论都提到了NSDecimalNumber。

请注意,我正在使用的应用程序将被国际化,因此以美分计算金额的选择实际上并不可行,因为货币结构在很大程度上取决于所使用的语言环境。

我90%的人肯定我需要使用NSDecimalNumber,但是由于我在网络上没有找到明确的答案(例如:“如果您要花钱,请使用NSDecimalNumber!”),我想在这里问一下。也许答案对大多数人来说是显而易见的,但是我想在开始大规模重构应用程序之前先确定一下。

说服我 :)


蓝山帝景
浏览 899回答 3
3回答

慕田峪9158850

(改编自我对其他答案的评论。)是的你应该。仅当您不需要代表半分钱时,整数便士才能起作用。如果发生这种情况,您可以将其更改为半美分,但是如果您需要代表四分之一美分或八分之一美分呢?唯一合适的解决方案是NSDecimalNumber(或类似的东西),它将问题推迟到10 ^ -128¢(即0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001¢)。(另一种方法是任意精度算术,但是需要一个单独的库,例如GNU MP Bignum库。GMP在LGPL之下。我从未使用过该库,也不知道它是如何工作的,所以我无法说出它对您的效果如何。)[编辑:显然,至少有一个人布拉德·拉尔森(Brad Larson)认为我在这个答案的某个地方谈论二进制浮点数。我不是。]
打开App,查看更多内容
随时随地看视频慕课网APP