使用 NSDecimalNumber 或 Float 进行计算
Doing calculation with NSDecimalNumber or Float
我必须在我的应用程序中进行计算,我有这样的公式:
result = Capital * rate / (1- 1/(1+ rate)^frequence)
我在网上看到用浮点数做计算是无损的。
我应该在我的情况下使用 NSDecimalNumber 吗?
包括 NSDecimalNumber
在内的所有数字都只有特定的准确度。
Floats 和 Doubles 是数字的二进制表示,它们分别可以表示 23 位和 52 位二进制数字(大约 7 位和 16 位十进制数字)。
这意味着有些数字无法精确表示。例如,考虑 1 / 3
- 要精确表示,您需要无限数量的数字 (0.333333333333...
)。
在大多数情况下,16 位十进制数字就足够了,尤其是当计算结果不必绝对准确时。精度也会受到计算顺序的影响。
NSDecimalNumber
最多可以容纳大约 30 位十进制数字(它不表示二进制数字),因此它可以比 Double 更精确地容纳数字。但是,NSDecimalNumber
的计算并不是在 CPU 上本地完成的,而且速度要慢得多。如果需要速度,这不是您想要做的事情。我们使用 NSDecimalNumber
主要用于货币计算,因为我们在那里需要高精度(特别是我们希望避免在转换为二进制时精度损失)。
我必须在我的应用程序中进行计算,我有这样的公式:
result = Capital * rate / (1- 1/(1+ rate)^frequence)
我在网上看到用浮点数做计算是无损的。
我应该在我的情况下使用 NSDecimalNumber 吗?
包括 NSDecimalNumber
在内的所有数字都只有特定的准确度。
Floats 和 Doubles 是数字的二进制表示,它们分别可以表示 23 位和 52 位二进制数字(大约 7 位和 16 位十进制数字)。
这意味着有些数字无法精确表示。例如,考虑 1 / 3
- 要精确表示,您需要无限数量的数字 (0.333333333333...
)。
在大多数情况下,16 位十进制数字就足够了,尤其是当计算结果不必绝对准确时。精度也会受到计算顺序的影响。
NSDecimalNumber
最多可以容纳大约 30 位十进制数字(它不表示二进制数字),因此它可以比 Double 更精确地容纳数字。但是,NSDecimalNumber
的计算并不是在 CPU 上本地完成的,而且速度要慢得多。如果需要速度,这不是您想要做的事情。我们使用 NSDecimalNumber
主要用于货币计算,因为我们在那里需要高精度(特别是我们希望避免在转换为二进制时精度损失)。