在 Swift 中将 JSON 数据转换为 Double
Posted
技术标签:
【中文标题】在 Swift 中将 JSON 数据转换为 Double【英文标题】:Convert JSON data to Double in Swift 【发布时间】:2017-01-23 14:01:21 【问题描述】:我收到以下 JSON 响应:
"id": 1,
"value": 519.6365
但是当我将value
转换为Double
时,我得到:519.63649999999996
如何保持原值? (不四舍五入)
【问题讨论】:
见Is floating point math broken? Is floating point math broken?的可能重复 请注意,打印 可选 双精度与打印非可选双精度不同(比较 ***.com/questions/39770303/…)。因此,解开(大概)可选选项使其至少 appear 如您所愿(即使它不会改变精度问题)。 【参考方案1】:在这种情况下,使用 Foundation 的 NSNumber 会是更好的解决方案。 将 json 值转换为 NSNumber 并且它总是可以 downcast 为 Double Value
在 Swift 4 中 -
let json = [
"id": 1,
"value": 519.6365
]
let value = (json["value"]! as NSNumber).doubleValue
print(value) // Outputs - 519.6365
如果服务器将值作为字符串发送,则需要首先将其转换为字符串,然后将值加倍为 -
value = (json["value"]! as NSString).doubleValue
【讨论】:
不幸的是,您不能使用NSNumber
和 Codable
结构 (Swift 5) 自动将结构编码为 JSON,它只会显示错误:Type 'MyCodableStruct' does not conform to protocol 'Decodable'
。【参考方案2】:
Double 就像 long Float,
Double 表示 64 位浮点数。
Float 表示一个 32 位浮点数。
因此,当您转换为 Double 时,会将 32 位添加到变量中,从而导致您看到的变化。
要保持数字不变,您需要将变量转换为 Float,表示较小的浮点数。
var value:Float = 519.6365
var valueDouble = Double(value) // 519.636474609375
Float(valueDouble) // 519.6365
【讨论】:
value
和valueDouble
都保存519.636474609375
的值,它们只是以不同的精度打印。在上述问题中,没有任何地方将 Float 转换为 Double。以上是关于在 Swift 中将 JSON 数据转换为 Double的主要内容,如果未能解决你的问题,请参考以下文章