什么时候使用 NSDecimal、NSDecimalNumber 而不是 double 更好?

When is it better to use an NSDecimal, NSDecimalNumber instead of a double?

对于简单的用途,例如跟踪 65.1 千克这样的体重值,使用 NSDecimal/NSDecimalNumber 比使用双倍有什么好处吗?

我的理解是双精度(甚至浮点)在这种情况下提供了足够的精度。如有不妥请指正

首先,阅读 Josh Caswell 的 link。与金钱打交道时,这一点尤为重要。在您的情况下,这可能重要也可能不重要,具体取决于您的目标。如果你输入 65.1 并且你想要精确地返回 65.1,那么你肯定需要使用一种可以正确舍入到小数值的格式,比如 NSDecimalNumber。如果,当你输入 65.1 时,你想要 "a value that is within a small error of 65.1," 那么 float 或 double 都可以(取决于你愿意接受多少错误)。

65.1 是一个很好的例子,因为它说明了问题。在这里 Swift 因为它很容易演示,但是 ObjC 是一样的:

 1> 65.1
$R0: Double = 65.099999999999994
  2>

1/10恰好是二进制的循环小数,就像1/3是十进制的循环小数一样。所以 65.1 编码为双精度是 "close to" 65.1,但不准确。如果您需要十进制编码数字的精确表示(即大多数人所期望的),请使用 NSDecimalNumber。这并不是说 NSDecimalNumber 比 double 更准确。它只是强加了与 double 不同的舍入误差。您更喜欢哪种舍入误差取决于您的用例。