相关疑难解决方法(0)

为什么双打在字典中的打印方式不同?

let dic : [Double : Double] = [1.1 : 2.3, 2.3 : 1.1, 1.2 : 2.3]

print(dic)// [2.2999999999999998: 1.1000000000000001, 1.2: 2.2999999999999998, 1.1000000000000001: 2.2999999999999998]



let double : Double = 2.3
let anotherdouble : Double = 1.1

print(double) // 2.3
print(anotherdouble) // 1.1
Run Code Online (Sandbox Code Playgroud)

我不明白为什么编译器以不同方式打印字典中的值?我在Swift 3,Xcode 8上.这是一个错误或一些奇怪的优化方式或东西的方式吗?

编辑

更奇怪的是:

有些值过去了,有些值低于标准值,有些值保持不变!1.1小于1.1000000000000001而2.3大于2.2999999999999998,1.2仅为1.2

swift

14
推荐指数
1
解决办法
1101
查看次数

Swift JSONEncoder 数字四舍五入

与所有 IEEE 7540 系统一样,Swift 中的数字 like4.7被视为类似的值4.7000000000000002。所以这并不奇怪:

% swift
Welcome to Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53).
Type :help for assistance.
  1> 4.7
$R0: Double = 4.7000000000000002
  2> 4.7 == 4.7000000000000002
$R1: Bool = true
Run Code Online (Sandbox Code Playgroud)

这是一个很好理解的世界现实,因此不需要通过包含指向浮点精度损失背景文章链接的评论来解决。

当使用内置的 编码这个数字时JSONEncoder,我们看到:

  4> String(data: JSONEncoder().encode([4.7]), encoding: .utf8) 
$R2: String? = "[4.7000000000000002]"
Run Code Online (Sandbox Code Playgroud)

这不是不正确,因为维基百科说这有关JSON和浮点数:

JSON 标准对上溢、下溢、精度损失、舍入或带符号零等实现细节没有要求,但它确实建议期望不超过 IEEE 754 binary64 精度以实现“良好的互操作性”。将浮点数的机器级二进制表示(如 binary64)序列化为人类可读的十进制表示(如 JSON 中的数字)并返回时没有固有的精度损失,因为存在已发布的算法来准确地执行此操作和最佳。

但是,其他 JavaScript 环境倾向于对这些数字进行四舍五入。例如使用 JavaScriptCore:

% /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Helpers/jsc

>>> 4.7 == 4.7000000000000002
true
>>> JSON.stringify([4.7000000000000002])
[4.7]
Run Code Online (Sandbox Code Playgroud)

并与节点:

% …
Run Code Online (Sandbox Code Playgroud)

json swift

6
推荐指数
1
解决办法
908
查看次数

标签 统计

swift ×2

json ×1