dna*_*oli 5 decimal objective-c
我有一个类似这样的计算:
Price = value * randomNumberBetween(decimalValueA, decimalValueB)
Run Code Online (Sandbox Code Playgroud)
我最初使用浮点数/双打来生成这个.然而,在对objective-c进行了更多的讨论后,有人多次提到,在计算货币时你应该使用NSDecimalNumber.我遇到的问题是我在比较和事物中使用这个"价格"变量,例如:
if (deposit/price) < 0.2
return price*0.05;
Run Code Online (Sandbox Code Playgroud)
使用NSDecimalNumber会使这更加困难.据我所知,我应该将任何幻数(在本例中为0.2和0.05)转换为NSDecimalNumber,然后我可以比较它们并使用NSDecimalMultiply等函数.
另外,如果我有一个类似的功能:
return (minRandomPercentage + ((maxRandomPercentage - minRandomPercentage) * (randomNumber)
Run Code Online (Sandbox Code Playgroud)
它最终成为这个荒谬的嵌套函数调用字符串,如:
return [minRandomPercentage decimalNumberByAdding:[[maxRandomPercentage decimalNumberBySubtracting: minRandomPercentage] decimalNumberByMultiplyingBy:random]]
Run Code Online (Sandbox Code Playgroud)
这是否严重如何客观c处理小数?任何人都可以给我任何关于如何使这一点变得不那么艰难的线索吗?如果我可以与结果进行比较而不必投射我拥有的每个幻数,我可以使用嵌套函数调用.
如果您无法承受标准base-2浮点类型可能出现的舍入错误,则必须使用NSDecimal或NSDecimalNumber.NSDecimal是一个C结构,Foundation提供了一个C接口来处理它.它提供NSDecimalAdd,NSDecimalMultiply等功能.
从数字和值编程指南:如果您不需要将十进制数视为对象,也可以考虑C接口 - 也就是说,如果您不需要将它们存储在面向对象的集合中,如NSArray的实例或NSDictionary.如果您需要最高效率,也可以考虑C接口.C接口比NSDecimalNumber类更快并且使用更少的内存.
如果您正在编写面向对象的代码,并且您没有与大量数据集进行交互,那么最好坚持使用NSDecimalNumber.如果您对代码进行概要分析并发现使用NSDecimalNumber导致高内存开销,那么您可能需要考虑替代方案.
如果不考虑舍入错误,您还可以使用本机C标量.请参阅:如何添加两个NSNumber对象?
当您需要将数字传递给方法或在集合中存储数字时,NSNumber和NSDecimalNumber将用作对象包装器.由于NSArray,NSSet,NSDictionary等仅允许您存储类型为"id"的对象,因此您无法本地存储整数,浮点数等.
如果您正在处理大型数据集并且可以承受舍入错误,则可以使用整数,浮点数,双精度等.然后,当您有结果并且需要存储它或将其传递给另一个对象时,您可以相应地将其包装在NSNumber中.
如果确实需要存储大量数字,那么使用C数组比初始化和存储大量NSNumber对象要高效得多.