在Swift中将JSON数据转换为Double
我收到以下JSON响应:在Swift中将JSON数据转换为Double,json,swift,double,Json,Swift,Double,我收到以下JSON响应: { "id": 1, "value": 519.6365 } 但是当我将值转换为双精度时,我得到:519.63649999996 如何保持原值?(没有四舍五入)双精度就像长浮点 Double表示64位浮点数 var value:Float = 519.6365 var valueDouble = Double(value) // 519.636474609375 Float(valueDouble) // 519.6365 Float表示32位浮点数 va
{
"id": 1,
"value": 519.6365
}
但是当我将值
转换为双精度
时,我得到:519.63649999996
如何保持原值?(没有四舍五入)双精度就像长浮点 Double表示64位浮点数
var value:Float = 519.6365
var valueDouble = Double(value) // 519.636474609375
Float(valueDouble) // 519.6365
Float表示32位浮点数
var value:Float = 519.6365
var valueDouble = Double(value) // 519.636474609375
Float(valueDouble) // 519.6365
因此,当您强制转换为Double时,32位被添加到变量中,导致您看到的更改
要保持数字不变,需要将变量强制转换为Float,表示较小的浮点数
var value:Float = 519.6365
var valueDouble = Double(value) // 519.636474609375
Float(valueDouble) // 519.6365
在这种情况下,使用基金会的NSNumber将是更好的解决方案。 将json值转换为NSNumber,并且它始终可以向下转换为双精度值 在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
请参阅可能的副本,注意打印可选双精度打印与打印非可选双精度打印使用不同的精度(比较)。因此,展开(可能是)可选项至少会使其显示为您所期望的样子(即使它不会改变精度问题)。
value
和valueDouble
都保留值519.636474609375
,它们仅以不同的精度打印。上面的问题中没有一个是浮点转换为双精度。不幸的是,您不能使用NSNumber
和Codable
struct(Swift 5)将结构自动编码为JSON,它只会显示一个错误:类型“mycdablestruct”不符合协议“Decodable”
。