我试图将的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)
即使在操场上它显示eightOne为0.8100000000000001尽可能内部表示去。但是,在此将其转换为字符串时,会斩掉其余部分。
我肯定可以解决此问题,因为您需要将其分类以进行任何类型的财务处理(例如,在Java中,我们知道仅BigDecimals在涉及财务价值时才使用)。
请帮忙。:)
注意:这里的重点是序列化到JSON。不只是简单地取消NSString( format: "%\(0.2)f", 0.81)。
对于精确的 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)
| 归档时间: |
|
| 查看次数: |
992 次 |
| 最近记录: |