将NSDecimalNumber用于浮点算术而不是普通双精度是一个好主意吗?

时间:2009-08-25 17:03:41

标签: iphone cocoa-touch uikit floating-point

我想知道NSDecimalNumber的重点是什么。它提供了一些算术方法,但为什么我应该使用NSDecimalNumber而不仅仅是双倍或NSNumber?苹果在那里照顾一些浮点算术丑陋吗?在大量使用高精度和大浮点数学时,它会让生活更轻松吗?

3 个答案:

答案 0 :(得分:1)

NSDecimalNumber是一个固定的精度(和比例)整数,按比例缩放到一定大小以表示小数。这与浮点数有点不同(显然,浮点数......)

例如,假设您需要代表0.00到999.99之间的金额,您可以将其存储在0到99999之间的整数中,作为便士金额。比例(以数字表示)为2,精度为5.在浮点数中,精度为5,浮点数可以表示为.00001至99999,但不能表示为999.999。

答案 1 :(得分:1)

这完全取决于您的需求。 它是精度,速度和数据大小之间的权衡。

如果您正在编写会计应用程序,则不会丢失任何精度,因此可能会使用NSDecimal编号。

你正在进行复杂的数值分析,速度可能很重要,因此NSDecimalNumber会太慢。但即使在这种情况下,您的分析也会考虑您可以承受的精确度和误差,这里可能会出现需要更多精度的情况,这些精度会给您带来双倍的效果。

NSNumber是一个单独的案例,它是一个类集群,允许在其他对象中存储C类型的数字,并在Cocoa中使用。

答案 2 :(得分:1)

如果您的软件处理金钱或会计师感兴趣的其他非整数数字,建议您使用十进制数(而不是底层硬件优化处理的二进制数);这就是为什么各种通用语言和数据库向后弯曲以支持十进制非整数,而不仅仅是二进制非整数。

二元非整数的舍入问题可能很容易导致几分之一的差异,在极限情况下,甚至可能使您陷入法律困境,更实际的是,会计师和其他人会在处理在你的程序中,无论你多么坚定地反对,你都可以将钱和&#c作为错误! - )