我有一个plist (用XCode创建),其中包含一个充满"Numbers“(0.01,1,2,6)的数组,当用initWithContentsOfFile重构时,它可以解压到NSValues中。如何将这些NSValues转换为NSDecimalNumbers,以便将它们相加在一起?它们将被视为货币值,因此只需要2位(也许4位)小数位的精度。
我尝试将plist值保存为"String“而不是"Number”,并使用NSDecimalNumber的initWithString设置该值,但NSValue不响应stringValue。
在Cocoa中,处理数字似乎特别令人困惑。如此多的框架中有如此多的容器格式……:-(
发布于 2009-07-07 05:17:59
要学习的第一个教训是,在表示货币时,如果您想要任何精度,请使用整数而不是浮点(十进制)数字。(如果需要显示美分,则除以100.0,等等)计算机在二进制(以2为基数)方面是完美无缺的,但如果你试图用二进制表示一些不能分解为1/(2^n)因数的东西,你就会遇到精度错误。(尝试0.1 + 0.1,看看会得到什么。)
也就是说,当您使用诸如-[NSArray initWithContentsOfFile:]之类的东西来“重构”它时,您在其中指定数字的XML标记对于如何根据Cocoa类来解释这些值肯定是有影响的。有关更多详细信息和示例,请参阅plist man page和this Apple article。
要实现您所要求的,请确保在plist中的值周围使用了<real>或<integer> (以及匹配的结束标记)。(属性列表编辑器和Xcode应根据数字是否有小数点自动使用正确的小数点。)在我的测试中,实数和整数都作为NSNumber对象读入。NSDecimalNumber是NSNumber的一个子类,但我不能完全确定CFNumber的免费桥接在所有情况下是如何工作的。实验可能是解决这一问题的最好方法。
发布于 2009-07-07 17:27:47
您应该能够将您的数字作为字符串直接存储在属性列表中。将它们存储在plist中时,您不需要对NSStrings进行任何NSValue包装。我建议将应用程序中的数字保留为NSDecimals或NSDecimalNumbers,以避免任何浮点错误,使用initWithString:locale:从plist中读取它们,并使用descriptionWithLocale:将它们写入plist。将小数存储和检索为字符串可避免任何与浮点数之间的转换错误。
https://stackoverflow.com/questions/1090251
复制相似问题