NSJSONSerialization用小十进制数字

I S*_*son 5 json swift

我试图将的Double值包含0.81在由生成的JSON中NSJSONSerialization。代码如下:

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

输出为:

{
  "value" : 0.8100000000000001
}
Run Code Online (Sandbox Code Playgroud)

但是我想看到的是:

{
  "value" : 0.81
}
Run Code Online (Sandbox Code Playgroud)

NSJSONSerialization该怎么做?

让我感到困惑的另一件事是Swift对64bit的处理Double。在操场上,我也可以这样做:

let eightOne:Double = 0.81
"\(eightOne)"
print( eightOne )
Run Code Online (Sandbox Code Playgroud)

然后根据需要输出:

0.81
Run Code Online (Sandbox Code Playgroud)

即使在操场上它显示eightOne0.8100000000000001尽可能内部表示去。但是,在此将其转换为字符串时,会斩掉其余部分。

我肯定可以解决此问题,因为您需要将其分类以进行任何类型的财务处理(例如,在Java中,我们知道仅BigDecimals在涉及财务价值时才使用)。

请帮忙。:)

注意:这里的重点是序列化到JSON。不只是简单地取消NSString( format: "%\(0.2)f", 0.81)

Mar*_*n R 8

对于精确的 base-10 算术(最多 38 个有效数字),您可以使用NSDecimalNumber

let jsonInput = [ "value":  NSDecimalNumber(string: "0.81") ]
Run Code Online (Sandbox Code Playgroud)

或者

let val = NSDecimalNumber(integer: 81).decimalNumberByDividingBy(NSDecimalNumber(integer: 100))
let jsonInput = [ "value":  val ]
Run Code Online (Sandbox Code Playgroud)

然后

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

产生输出

{
  "value" : 0.81
}
Run Code Online (Sandbox Code Playgroud)