当我开始编写第一个应用程序的代码时,我使用NSNumber来获取货币值,而无需三思而后行。然后我认为也许c类型足以应付我的价值观。但是,由于其出色的舍入功能,在iPhone SDK论坛中建议我使用NSDecimalNumber。我不是气质的数学家,我认为尾数/指数范式可能会过大。仍然,googlin,我意识到,关于可可中的金钱/货币的大多数讨论都提到了NSDecimalNumber。请注意,我正在使用的应用程序将被国际化,因此以美分计算金额的选择实际上并不可行,因为货币结构在很大程度上取决于所使用的语言环境。我90%的人肯定我需要使用NSDecimalNumber,但是由于我在网络上没有找到明确的答案(例如:“如果您要花钱,请使用NSDecimalNumber!”),我想在这里问一下。也许答案对大多数人来说是显而易见的,但是我想在开始大规模重构应用程序之前先确定一下。说服我 :)
3 回答
慕田峪9158850
TA贡献1794条经验 获得超7个赞
(改编自我对其他答案的评论。)
是的你应该。仅当您不需要代表半分钱时,整数便士才能起作用。如果发生这种情况,您可以将其更改为半美分,但是如果您需要代表四分之一美分或八分之一美分呢?
唯一合适的解决方案是NSDecimalNumber(或类似的东西),它将问题推迟到10 ^ -128¢(即
0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000001¢)。
(另一种方法是任意精度算术,但是需要一个单独的库,例如GNU MP Bignum库。GMP在LGPL之下。我从未使用过该库,也不知道它是如何工作的,所以我无法说出它对您的效果如何。)
[编辑:显然,至少有一个人布拉德·拉尔森(Brad Larson)认为我在这个答案的某个地方谈论二进制浮点数。我不是。]
添加回答
举报
0/150
提交
取消