Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中将JSON数据转换为Double_Json_Swift_Double - Fatal编程技术网

在Swift中将JSON数据转换为Double

在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

我收到以下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位浮点数

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”