在 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 并且它总是可以 downcastDouble 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

【讨论】:

不幸的是,您不能使用 NSNumberCodable 结构 (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 

【讨论】:

valuevalueDouble 都保存519.636474609375 的值,它们只是以不同的精度打印。在上述问题中,没有任何地方将 Float 转换为 Double。

以上是关于在 Swift 中将 JSON 数据转换为 Double的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 中将 JSON 字符串转换为字典

在 Swift 中将字典转换为 JSON

在 Swift 中将字典转换为 JSON

在 Swift 4 中将 Json 对象转换为数组格式

在 Swift/Xcode 中将 JSON 文件转换为数组

如何在 Swift 中将 Realm 对象转换为 JSON?