iOS:NSDecimalNumber 计算和货币的准确性

标签 ios core-data currency nsdecimalnumber

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

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

好的,所以我的 100 美元现在是 8.33333333333333.... 现在在我的应用程序的某些地方,我想将值(value)恢复到每年。因此,如果我现在计算 12*8.33333333,我得到的不是 100,而是非常接近的值:99.999999999999999999999999999999999996。

对于进度条,我正在这样做,结果是 100%,这正是我真正想要的(花钱是 100,预算是 99.999999999999999999999999999999999996):

[[moneySpent decimalNumberByDividingBy:budget] doubleValue]

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

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

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

那么你会如何处理呢?我有点困惑……我应该只使用 doubleValues 进行比较吗?或者我应该总是四舍五入 NSDecimalNumbers 还是什么?

最佳答案

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

关于iOS:NSDecimalNumber 计算和货币的准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22450522/

相关文章:

iOS:迁移coredata关系时的value expression函数是什么?

ios - iTunes Connect-无法编辑应用程序信息,提交以供审阅,发布等

ios - 向 Twitter 发布状态更新返回 403 forbidden 错误

ios - 核心数据测试 : force external storage on iOS

objective-c - Objective-c:如何存储大量数据(iOS RSS应用程序)

javascript - JavaScript 中是否有将值转换为特定语言环境格式的功能?

印度货币的 PHP 货币格式?

javascript - 将乘法结果格式化为小数点后两位

ios - 如何从弹出 View 中关闭第二个 View Controller

ios - iOS 中用于存储配置文件和检查 IAP 的用户 ID