将 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 时出现精度错误的主要内容,如果未能解决你的问题,请参考以下文章