何时使用NSDecimal,NSDecimalNumber而不是double?

对于简单的用途,例如跟踪重量值如65.1kg,使用NSDecimal / NSDecimalNumber超过双倍有什么好处?

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

首先,阅读Josh Caswell的链接。 它在与钱合作时尤其重要。 根据您的目标,在您的情况下,它可能重要或不重要。 如果你输入65.1而你想要准确地退出65.1,那么你肯定需要使用一种正确NSDecimalNumberNSDecimalNumber等十进制值的格式。 如果,当你输入65.1时,你想要“一个65.1的小错误值”,那么浮动或双重就好了(取决于你愿意接受多少错误)。

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

  1> 65.1 $R0: Double = 65.099999999999994 2> 

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