什么';Swift中金融变量的正确数字类型是什么?

什么';Swift中金融变量的正确数字类型是什么?,swift,swift2,currency,financial,Swift,Swift2,Currency,Financial,我习惯于用Java编程,在Java中,类型是存储财务值的最佳方式,因为可以通过各种方式指定计算的舍入规则 在最新的swift版本(撰写本文时为2.1版)中,哪种原生类型更好地支持财务值的正确计算和四舍五入?有没有与java的BigDecimal等价的东西?或者类似的东西?您可以使用NSDecimalNumber或NSDecimalNumber来表示任意精度的数字 如果您关心在浮点或双精度中存储例如$1.23,以及浮点精度错误可能导致的不精确性,也就是说,如果您确实希望坚持整数形式的美分或便士(或

我习惯于用Java编程,在Java中,类型是存储财务值的最佳方式,因为可以通过各种方式指定计算的舍入规则


在最新的swift版本(撰写本文时为2.1版)中,哪种原生类型更好地支持财务值的正确计算和四舍五入?有没有与java的BigDecimal等价的东西?或者类似的东西?

您可以使用
NSDecimalNumber
NSDecimalNumber
来表示任意精度的数字


如果您关心在
浮点
双精度
中存储例如$1.23,以及浮点精度错误可能导致的不精确性,也就是说,如果您确实希望坚持整数形式的美分或便士(或其他任何形式),请参阅。然后用一个整数来存储你的值,用便士/美分作为单位,而不是英镑/美元。然后,在处理便士/美分的整数时,您将获得100%的准确率,这比使用
NSDecimalNumber
之类的类更容易。然后,该值的显示纯粹是一个表示问题

但是,如果您需要处理便士/美分的分数,那么您可能需要的可能就是小数


我建议研究像这样的类实际上是如何工作的,以及浮点数是如何工作的,因为了解这一点将帮助您了解为什么会出现精度错误,以及像
NSDecimalNumber
这样的类的精度限制是什么,为什么它更适合存储十进制数,为什么浮点数擅长存储像17/262144这样的数字(即分母是2的幂),但不能存储1/100等。

我接受了这个答案,因为它更完整。在许多情况下(例如只存储值),将美分存储为整数的选项应该足够了。在我的例子中,应用程序需要计算分期付款,并且需要轮次,例如,10美元除以3将是3.333333美元。。。一个人不能支付美分的分数。在这种情况下,你应该使用整数模运算。例如,10美元=1000美分,(1000/3)使用整数运算得到333美分,(1000%3)得到1美分,因此你有一个1美分的总余数,你需要将其添加到分期付款中。这正好给了我们333+333+334=1000×-将它们显示为美元,你有$3.33+$3.33+$3.34。无精度损失,结果完美,无舍入误差@Jotesse当然@jhabbott,这也应该考虑,但这只是一个例子。例如,我忘了提到有兴趣,但无论如何,谢谢你的解释。我相信面对这个问题的人会把它作为一种选择。