为 NSNumber 值设置精度

Posted

技术标签:

【中文标题】为 NSNumber 值设置精度【英文标题】:Set Precision for NSNumber value 【发布时间】:2013-06-03 15:30:12 【问题描述】:

我遇到了一个与当前包含 0.522000003606 的 NSNumber 变量“num”有关的问题

我在 *** 上查找了其他几个问题,其他人也遇到了同样的问题,但什么也没有。我的项目目前正在使用 ARC,因此我认为某些功能不可用,也就是说,除非我在当前想要设置 NSNumber 精度的类中不允许使用 ARC。

我知道 NSNumberFormatter 是我必须使用的基本 setPrecision 类函数,但我遇到了问题......

每次我使用 NSNumberFormatter 时,它都会返回 NULL!!!

nowValue = [now objectForKey:@"value"]; // This is what IM ACTUALLY DOING!!!
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setRoundingMode:NSNumberFormatterRoundHalfUp];
[formatter setFormatWidth:2];
NSString *string = [formatter stringFromNumber:num];

我觉得这太微不足道了!任何人都可以给业余程序员一些建议吗? :)

编辑:

这就是我现在正在做的,使用 NSDecimal 而不是 NSNumber。 "Now" 是一个大字典对象,nowValue 是 num 的副本。

nowValue = (__bridge NSDecimal *)([now objectForKey:@"value"]);

【问题讨论】:

向我们展示你 NSLog "num" 的值进入的代码。 NSDecimal 是一个结构,而不是一个对象,所以现在我真的很困惑。用一个真实的例子更新你的问题。从初始化为 0.522000003606 的 NSNumber 开始,然后是格式化程序,然后是不是您想要的输出,然后告诉我们您想要的确切字符串的样子。 [now objectForKey:@"value"] 实际返回的是什么类型的对象?你能显示NSLog(@"%@", [[now objectForKey:@"value"] class]的输出吗? - 请注意,任何投射或桥接都不会改变对象,因此无济于事。 NSLog(@"%@", [[now objectForKey:@"value"] class] 返回一个 __NSCFString 对象。 所以布鲁诺是对的,尽管他删除了他的答案。 JSON 正在返回一个字符串,而不是一个数值——NSString,而不是 NSNumber。 (如果您查看 JSON 源代码,您会看到数字用引号括起来,使其成为字符串。) 【参考方案1】:

问题解决了!.....感谢大家的输入,但是是的....这是一个字符串。 Martin R,感谢您调试代码。并且理解 _NSCFString 实际上只是一个 NSString 的包装,但它们基本上是相同的。

这是我的解决方案...

nowValue outputs : 24.14295959472

nowValue = [now objectForKey:@"value"];
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * nowNum = [f numberFromString:nowValue];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:2];
nowValueFormatted = [formatter stringFromNumber:nowNum];

nowNum outputs : 24.14

【讨论】:

我计划有一个格式化程序函数来提高效率,因为显然使用格式化程序类是非常低效的......在函数中,我将包含静态变量以允许格式化程序对象不被重新分配和占用大量内存

以上是关于为 NSNumber 值设置精度的主要内容,如果未能解决你的问题,请参考以下文章

NSNumber -initWithDouble 和结果值的问题

iOS - 数值精度处理之NSDecimalNumber

从 plist/dictionary 转换为 NSNumber 时出错

如何将 NSNumber 转换和比较为 BOOL?

将 NSNumber* 的 NSArray 存储为 Core Data 中的 NSString

将 NSNumber 设置为 NSManagedObject 属性