【发布时间】:2016-02-19 10:36:29
【问题描述】:
我正在使用 AlamoFire 调用我的网络服务:
ApiManager.manager.request(.GET, webServiceCallUrl, parameters: ["id": 123])
.validate()
.responseJSON { response in
switch response.result {
case .Success:
print(response.result.value!)
//...
case .Failure:
//...
}
}
我的网络服务返回以下 JSON:
{
//...
"InvoiceLines": [{
"Amount": 0.94
}]
}
Alamofire 将其视为双精度而不是小数,因此在输出控制台中我得到:
{
//...
InvoiceLines = (
{
Amount = "0.9399999999999999";
}
);
}
这会导致我的代码进一步向下舍入错误。
我已在服务器上使用 Fiddler 检查 Web 服务 JSON 响应以确认它返回 0.94。因此,我可以排除服务器是问题并怀疑responseJSON 导致了我的问题。
如何让货币值返回正确的NSDecimalNumber 值?
Jim 回答/cmets 后的额外信息:
var stringToTest = "{\"Amount\":0.94}"
var data = stringToTest.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
var object = try NSJSONSerialization.JSONObjectWithData(data!, options: opt)
var a = object["Amount"]
print(a) //"Optional(0.9399999999999999)"
var b = NSDecimalNumber(decimal: (object["Amount"] as! NSNumber).decimalValue)
print(b) //"0.9399999999999999"
如果我将值作为 JSON 中的字符串传递,则可以得到我想要的结果:
var stringToTest = "{\"Amount\":\"0.94\"}"
var data = stringToTest.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
var object = try NSJSONSerialization.JSONObjectWithData(data!, options: opt)
var c = NSDecimalNumber(string: (object["Amount"] as! String))
print(c) //0.94
但是,我不想对 API 进行实施更改,因此需要一种使 JSON 保持相同格式的解决方案。每次都是我唯一的选择吗?这似乎是一种错误的做事方式,并可能在未来引发舍入问题。
【问题讨论】:
标签: json swift alamofire nsdecimalnumber