使用NSDecimalNumber或Float进行计算

时间:2015-06-20 18:03:08

标签: objective-c floating-accuracy nsdecimalnumber

我必须在我的应用程序中进行计算,我有像这样的模型:

result = Capital * rate / (1- 1/(1+ rate)^frequence)

我在互联网上读过,用浮点数进行计算可能是无损的。

我应该在我的情况下使用NSDecimalNumber吗?

1 个答案:

答案 0 :(得分:1)

包括NSDecimalNumber在内的所有数字都只有特定的准确性。 浮点数和双打数是数字的二进制表示,它们分别代表23和52个二进制数字(大约7和16个十进制数字)。

这意味着某些数字无法准确表示。例如,考虑1 / 3 - 要精确表示,您需要无限数量的数字(0.333333333333...)。

在大多数情况下,16位十进制数字绰绰有余,尤其是当计算结果不必绝对准确时。精度也会受到计算顺序的影响。

NSDecimalNumber最多可容纳30个十进制数字(它不能代表二进制数字),因此它可以比Double更准确地保存数字。但是,NSDecimalNumber的计算不是在CPU上本地完成的,而且速度要慢得多。如果需要速度,这不是你想要做的事情。我们主要使用NSDecimalNumber进行货币计算,因为我们需要高精度(特别是我们希望在转换为二进制和后退时避免精度损失)。