Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在objective-c中使用NSDecimalNumber_Objective C_Decimal - Fatal编程技术网

在objective-c中使用NSDecimalNumber

在objective-c中使用NSDecimalNumber,objective-c,decimal,Objective C,Decimal,我有一个这样的计算: Price = value * randomNumberBetween(decimalValueA, decimalValueB) 我最初是使用浮动/双精度生成的。然而,在查阅了更多有关objective-c的内容后,有人多次提到,在计算货币时,应该使用NSDecimalNumber。 我的问题是,我在比较和其他事情中使用了这个“价格”变量,例如: if (deposit/price) < 0.2 return price*0.05; 它最终变成了一个荒谬

我有一个这样的计算:

Price = value * randomNumberBetween(decimalValueA, decimalValueB)
我最初是使用浮动/双精度生成的。然而,在查阅了更多有关objective-c的内容后,有人多次提到,在计算货币时,应该使用NSDecimalNumber。 我的问题是,我在比较和其他事情中使用了这个“价格”变量,例如:

if (deposit/price) < 0.2
    return price*0.05;
它最终变成了一个荒谬的嵌套函数调用字符串,如:

return [minRandomPercentage decimalNumberByAdding:[[maxRandomPercentage decimalNumberBySubtracting:  minRandomPercentage] decimalNumberByMultiplyingBy:random]]

这就是objective-c处理小数的方式吗?有谁能给我一些线索,告诉我如何使这项工作变得不那么艰巨吗?如果我可以与结果进行比较,而不必强制转换我所有的幻数,我就可以接受嵌套函数调用。

如果您负担不起处理标准的base-2浮点类型可能出现的问题,则必须使用NSDecimal或NSDecimalNumber。NSCDEMAL是一个C结构,基础提供了一个C接口来处理它。它提供了NSDecimalAdd、NSDecimalMultiply等函数

:如果你不需要把十进制数当作对象,如果你不需要把它们存储在面向对象的集合中,比如NStase/Nas字典实例,你可能会考虑C接口。如果你需要最大效率,你也可以考虑C接口。与NSDecimalNumber类相比,C接口速度更快,占用的内存更少

如果您正在编写面向对象的代码,并且没有与海量数据集交互,那么最好还是使用NSDecimalNumber。如果您对代码进行了配置,并发现使用NSDECIMALLATION会导致高内存开销,那么您可能需要考虑备选方案。 如果舍入错误不是一个问题,那么也可以使用本机C标量。见:

当需要将数字传递给方法或在集合中存储数字时,NSNumber和NSDecimalNumber用作对象包装器。由于NSArray、NSSet、NSDictionary等仅允许您存储“id”类型的对象,因此不能以本机方式存储int、float等

如果您处理的是大型数据集,并且能够承受舍入误差,那么可以使用整数、浮点、双精度等原始值。然后,当您得到结果并需要存储它或将其传递给另一个对象时,您可以相应地将其包装在NSNumber中


如果您确实需要存储大量的数字集合,那么使用C数组比初始化和存储大量NSNumber对象要高效得多。

说真的,这就是在iOS中执行10进制算术的方法。正如您可能知道的,许多以10为基数精确表示的数字在以2为基数时没有精确表示,这可能会导致在使用以10为基数的系统(如货币或公制度量)时出现不可接受的舍入


NSDecimalNumber表示的值是对象,与int、float和double等内置数字类型不同。一开始使用方法进行算术运算似乎有些奇怪,但当你开始将值看作对象时,它就更有意义了。

但是如果我使用标量c类型,那么我就得不到小数的精度,是吗?我相信C中有十进制类型,但是objective-C库中不存在该类型的标题…@link664-我已经澄清了我的答案。那么我必须转换所有的幻数才能使用它们吗?例如,我想说[NSDecimalNumber numberWithFloat:0.25],但它给了我一个警告“由于numberWithFloat是一个NSNumber函数,不兼容的指针类型将'NSNumber*'发送到参数类型'NSDecimalNumber*'。@link664:如果您处理的是货币,为什么不使用原始整数数据类型?”?如果您的值是用“美分”而不是“美元”表示的(用您自己的i18n代替),那么您就不必担心分数。
return [minRandomPercentage decimalNumberByAdding:[[maxRandomPercentage decimalNumberBySubtracting:  minRandomPercentage] decimalNumberByMultiplyingBy:random]]