iOS:NSDecimalNumber计算和货币准确性

时间:2014-03-17 09:19:43

标签: ios core-data currency nsdecimalnumber

我正在计算一些值,这就是我遇到问题的地方。假设您的年度金额为100美元,并使用十进制数将其作为每月值保存到CoreData:

[self.sumPerMonth decimalNumberByAdding:[amount decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"12"]]];

好的,所以我的100美元现在是8.33333333333333 ....现在在我的应用程序的某些地方,我希望将价值恢复到每年。所以如果我现在计算12 * 8.33333333我不会得到100但非常接近:99.99999999999999999999999999999999999996。

对于进度条我正在这样做,这导致100%这是我真正想要的(moneySpent为100,预算为99.999999999999999999999999999999999996):

[[moneySpent decimalNumberByDividingBy:budget] doubleValue]

但如果我这样做(budgetLeft是预算 - moneySpent):

[budgetLeft compare:[NSDecimalNumber zero]] == NSOrderedAscending

这导致TRUE,这是错误的。对于货币,这应该是0,因为99.999999 ... 6应该是100.

那你怎么处理这个?我有点困惑......我应该只使用doubleValues进行比较吗?或者我应该总是围绕NSDecimalNumbers还是什么?

1 个答案:

答案 0 :(得分:2)

每当您需要回到“货币”时,您可以使用NSDecimalNumber的decimalNumberByRoundingAccordingToBehaviour:方法。 NSDecimalNumberBehaviours协议允许您指定舍入模式和比例(小数位) - 因此您可以在需要实际货币金额时舍入到两位小数 - 通常在任何计算结束时。