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

Posted

技术标签:

【中文标题】将 json 文件读入 CoreData 时出现精度错误【英文标题】:Precision error when reading json file into CoreData 【发布时间】:2015-08-24 19:55:42 【问题描述】:

我要做的是从 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 将它们保留为整数,则不存在这样的问题。

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

【问题讨论】:

【参考方案1】:

你是对的,这是因为用二进制格式表示浮点数。这些数字的准确性是有限度的。

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

如果您想绝对确定您拥有 8.5,请在 Core Data 模型编辑器中使用“十进制”类型。这将使用NSDecimalNumber 作为格式,旨在解决这个确切的问题。

【讨论】:

完美运行!谢谢一百万:)【参考方案2】:

很遗憾,您无法解决这个问题,因为这与浮点数的二进制表示有关。

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

【讨论】:

非常感谢您的详细解释。对于像我这样的计算机科学外行理解底层机制有很大帮助!

以上是关于将 json 文件读入 CoreData 时出现精度错误的主要内容,如果未能解决你的问题,请参考以下文章

从 S3 将嵌套文本文件读入 spark 时出现内存错误

将本地 JSON 文件解析成 Coredata 会导致错误

如何将json文件读入数据框?

将 json 文件读入 Spark DataFrame

将 JSON 文件读入表中

如何从 JSON 文件读入 JavaScript? [复制]