4

对于简单的用途,例如跟踪 65.1kg 之类的重量值,使用 NSDecimal/NSDecimalNumber 是否有任何好处?

我的理解是双倍(甚至浮点)在这种情况下提供了足够的精度。如果我错了,请纠正我。

4

1 回答 1

11

首先,阅读 Josh Caswell 的链接。在与金钱打交道时,这一点尤其重要。在您的情况下,这可能很重要,也可能不重要,这取决于您的目标。如果您输入 65.1 并且想要准确地返回 65.1,那么您肯定需要使用一种可以正确舍入为十进制值的格式,例如NSDecimalNumber. 如果在输入 65.1 时,您想要“一个在 65.1 的小误差范围内的值”,那么 float 或 double 都可以(取决于您愿意接受多少误差)。

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

 1> 65.1
$R0: Double = 65.099999999999994
  2>

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

于 2015-11-14T20:10:55.713 回答