gpt4 book ai didi

objective-c - 在 objective-c 中使用 NSDecimalNumber

转载 作者:太空狗 更新时间:2023-10-30 03:49:12 25 4
gpt4 key购买 nike

我有一个这样的计算:

Price = value * randomNumberBetween(decimalValueA, decimalValueB)

我最初是使用 float / double 生成的。然而,在进一步了解 objective-c 之后,人们多次提到在计算货币时应该使用 NSDecimalNumber。我遇到的问题是我在比较和事物中使用这个“价格”变量,例如:

if (deposit/price) < 0.2
return price*0.05;

使用 NSDecimalNumber 会使这变得更加困难。据我所知,我应该将任何魔数(Magic Number)(在本例中为 0.2 和 0.05)转换为 NSDecimalNumber,这样我就可以比较它们并使用 NSDecimalMultiply 等函数。

另外,如果我有一个类似这样的函数:

return (minRandomPercentage + ((maxRandomPercentage - minRandomPercentage) * (randomNumber)

它最终变成了这个可笑的嵌套函数调用字符串,例如:

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

这真的是 Objective-C 处理小数的方式吗?任何人都可以给我任何关于如何减少这一切的线索吗?如果我可以与结果进行比较而不必强制转换我拥有的每个魔数(Magic Number),我就可以接受嵌套函数调用。

最佳答案

如果您无力处理 rounding errors对于标准的 base-2 浮点类型可能出现的情况,您必须使用 NSDecimal 或 NSDecimalNumber。 NSDecimal 是一个 C 结构体,Foundation 提供了一个 C 接口(interface)来处理它。它提供了NSDecimalAdd、NSDecimalMultiply等函数。

来自Number and Value Programming Guide :如果您不需要将十进制数字视为对象,您可以考虑使用 C 接口(interface)——也就是说,如果您不需要将它们存储在面向对象的集合中,例如 NSArray 或 NSDictionary 的实例。如果您需要最高效率,您也可以考虑使用 C 接口(interface)。 C 接口(interface)比 NSDecimalNumber 类更快并且使用更少的内存。

如果您正在编写面向对象的代码,并且您不与海量数据集进行交互,那么最好坚持使用 NSDecimalNumber。如果您分析代码并发现使用 NSDecimalNumber 会导致高内存开销,那么您可能需要考虑替代方案。

如果舍入误差不是问题,您也可以使用原生 C 标量。请参阅:How to add two NSNumber objects?

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

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

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

关于objective-c - 在 objective-c 中使用 NSDecimalNumber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5508608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com