gpt4 book ai didi

json - NSJSONSerialization with small decimal numbers

转载 作者:搜寻专家 更新时间:2023-10-30 23:15:15 29 4
gpt4 key购买 nike

我试图在 NSJSONSerialization 生成的一些 JSON 中包含 Double0.81。代码如下:

let jsonInput = [ "value": 0.81 ]
let data = try NSJSONSerialization.dataWithJSONObject(jsonInput, options: NSJSONWritingOptions.PrettyPrinted)
let json = NSString(data: data, encoding: NSUTF8StringEncoding)!
print( json )

输出是:

{
"value" : 0.8100000000000001
}

但我想看到的是:

{
"value" : 0.81
}

我怎样才能让 NSJSONSerialization 做到这一点?

让我困惑的另一件事是 Swift 对 64 位 Double 的处理。就像在 Playground 上一样,我也可以这样做:

let eightOne:Double = 0.81
"\(eightOne)"
print( eightOne )

然后根据需要输出:

0.81

即使在 playground 中,就内部表示而言,它显示 eightOne0.8100000000000001。然而,当它转换为字符串时,它会砍掉其余部分。

我确定这已经解决了,因为您需要对它进行排序以进行任何类型的财务处理(例如,在 Java 中,我们知道我们只在涉及财务值时使用 BigDecimals)。

请帮忙。 :)

注意:这里的重点是序列化为 JSON。不仅仅是对 NSString( format: "%\(0.2)f", 0.81) 的简单调用。

最佳答案

用于精确的 base-10 算术(最多 38 位有效数字)你可以使用 NSDecimalNumber:

let jsonInput = [ "value":  NSDecimalNumber(string: "0.81") ]

let val = NSDecimalNumber(integer: 81).decimalNumberByDividingBy(NSDecimalNumber(integer: 100))
let jsonInput = [ "value": val ]

然后

let data = try NSJSONSerialization.dataWithJSONObject(jsonInput, options: NSJSONWritingOptions.PrettyPrinted)
let json = NSString(data: data, encoding: NSUTF8StringEncoding)!
print( json )

产生输出

{
"value" : 0.81
}

关于json - NSJSONSerialization with small decimal numbers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35053577/

29 4 0