首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将NSValue转换为NSDecimalNumber

将NSValue转换为NSDecimalNumber
EN

Stack Overflow用户
提问于 2009-07-07 03:36:14
回答 2查看 988关注 0票数 1

我有一个plist (用XCode创建),其中包含一个充满"Numbers“(0.01,1,2,6)的数组,当用initWithContentsOfFile重构时,它可以解压到NSValues中。如何将这些NSValues转换为NSDecimalNumbers,以便将它们相加在一起?它们将被视为货币值,因此只需要2位(也许4位)小数位的精度。

我尝试将plist值保存为"String“而不是"Number”,并使用NSDecimalNumber的initWithString设置该值,但NSValue不响应stringValue。

在Cocoa中,处理数字似乎特别令人困惑。如此多的框架中有如此多的容器格式……:-(

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-07 05:17:59

要学习的第一个教训是,在表示货币时,如果您想要任何精度,请使用整数而不是浮点(十进制)数字。(如果需要显示美分,则除以100.0,等等)计算机在二进制(以2为基数)方面是完美无缺的,但如果你试图用二进制表示一些不能分解为1/(2^n)因数的东西,你就会遇到精度错误。(尝试0.1 + 0.1,看看会得到什么。)

也就是说,当您使用诸如-[NSArray initWithContentsOfFile:]之类的东西来“重构”它时,您在其中指定数字的XML标记对于如何根据Cocoa类来解释这些值肯定是有影响的。有关更多详细信息和示例,请参阅plist man pagethis Apple article

要实现您所要求的,请确保在plist中的值周围使用了<real><integer> (以及匹配的结束标记)。(属性列表编辑器和Xcode应根据数字是否有小数点自动使用正确的小数点。)在我的测试中,实数和整数都作为NSNumber对象读入。NSDecimalNumber是NSNumber的一个子类,但我不能完全确定CFNumber的免费桥接在所有情况下是如何工作的。实验可能是解决这一问题的最好方法。

票数 0
EN

Stack Overflow用户

发布于 2009-07-07 17:27:47

您应该能够将您的数字作为字符串直接存储在属性列表中。将它们存储在plist中时,您不需要对NSStrings进行任何NSValue包装。我建议将应用程序中的数字保留为NSDecimals或NSDecimalNumbers,以避免任何浮点错误,使用initWithString:locale:从plist中读取它们,并使用descriptionWithLocale:将它们写入plist。将小数存储和检索为字符串可避免任何与浮点数之间的转换错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1090251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档