将json文件读入CoreData时出现精度错误

时间:2015-08-24 19:55:42

标签: ios json swift core-data

我尝试做的是从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而将它们保留为整数,则没有这样的问题。

知道如何解决这个问题吗?建议非常感谢!

2 个答案:

答案 0 :(得分:2)

你是对的,这是由于以二进制格式表示浮点数。这些数字的准确程度有限制。

在大多数情况下,您所看到的内容是可以接受的,并且不会导致错误。

如果你想绝对确定你有8.5,请使用&#34;十进制&#34;键入Core Data模型编辑器。这将使用NSDecimalNumber作为格式,旨在解决此问题。

答案 1 :(得分:1)

不幸的是,你无法解决这个问题,因为这与浮点数的二进制表示有关。

二进制8.95大约是1000.11110011001100110011001100110011001 ...并且不会就此止步。 Double仅存储64位,因此无法将数字转换为/存储为原始数字。