我尝试做的是从json文件中读取字典数组并将其存储在核心数据中。数据如下:
[{"category": "A", "name": "x", "price": 7.95},
{"category": "A", "name": "y", "price": 7.95},
{"category": "B", "name": "z", "price": 8.95},
...]
阅读它的代码如下:
if let dataPath = NSBundle.mainBundle().pathForResource("menu", ofType:"json") {
if let jsonData = NSData(contentsOfFile: dataPath, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil) {
if let menuData: AnyObject = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) {
if let menuArray = menuData as? NSArray {
for i in 0 ..< menuArray.count {
if let dish = menuArray[i] as? NSDictionary {
let newDishItem = DishItem(entity: ent!, insertIntoManagedObjectContext: self.context)
newDishItem.name = dish["name"] as! String
newDishItem.category = dish["category"] as! String
newDishItem.price = dish["price"] as! Double
} else {print("element \(i) in array is not a dictionary! \n")}
}
} else {print("data loaded is not an array!\n")}
} else {print("Unable to deserialize json data\n")}
} else {print("Unable to load data!\n")}
} else { print("data file does not exist!\n") }
问题是,当我从核心数据中读回存储的价格时,一些价格变为8.9499999 ......当它应该是8.95时,但有些价格很好。
我认为它与将数字存储在二进制数据中有关,并尝试将json中的所有数字更改为整数(8.95到895),并将其保存为核心数据时除以100。但是,这不起作用。但是我注意到,如果我不将它除以100而将它们保留为整数,则没有这样的问题。
知道如何解决这个问题吗?建议非常感谢!
答案 0 :(得分:2)
你是对的,这是由于以二进制格式表示浮点数。这些数字的准确程度有限制。
在大多数情况下,您所看到的内容是可以接受的,并且不会导致错误。
如果你想绝对确定你有8.5,请使用&#34;十进制&#34;键入Core Data模型编辑器。这将使用NSDecimalNumber
作为格式,旨在解决此问题。
答案 1 :(得分:1)
不幸的是,你无法解决这个问题,因为这与浮点数的二进制表示有关。
二进制8.95大约是1000.11110011001100110011001100110011001 ...并且不会就此止步。 Double
仅存储64位,因此无法将数字转换为/存储为原始数字。