gpt4 book ai didi

swift - 为什么 double 在字典中的打印方式不同?

转载 作者:IT王子 更新时间:2023-10-29 05:21:19 27 4
gpt4 key购买 nike

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

我不明白为什么编译器以不同的方式打印字典中的值?我正在使用 Swift 3、Xcode 8。这是一个错误还是某种奇怪的优化方式?

编辑

更奇怪的是:

有些值会超过,有些会低于,有些会保持原样! 1.1 小于 1.1000000000000001 而 2.3 大于 2.2999999999999998,1.2 就是 1.2

最佳答案

如评论中所述,Double 无法存储值 1.1 完全正确。 Swift 使用(像许多其他语言一样)根据 IEEE 754 的二进制 float 标准。

可以表示为 Double 的最接近 1.1 的数字是

1.100000000000000088817841970012523233890533447265625

可以表示为 Double 的最接近 2.3 的数字是

2.29999999999999982236431605997495353221893310546875

打印那个数字意味着它被转换成一个字符串再次是十进制表示,这是用不同的方式完成的精度,取决于您打印数字的方式。

来自 HashedCollections.swift.gyb 的源代码可以看到 description 方法Dictionary 使用 debugPrint() 作为键和值,debugPrint(x) 打印 x.debugDescription 的值(如果 x 符合 CustomDebugStringConvertible)。

另一方面,如果 x 符合,print(x) 调用 x.descriptionCustomStringConvertible

所以你看到的是description的不同输出和 DoubledebugDescription:

print(1.1.description) // 1.1
print(1.1.debugDescription) // 1.1000000000000001

从Swift源码可以看出两者都使用 swift_floatingPointToString()Stubs.cpp 中发挥作用, Debug 参数分别设置为 falsetrue。此参数控制数字到字符串转换的精度:

int Precision = std::numeric_limits<T>::digits10;
if (Debug) {
Precision = std::numeric_limits<T>::max_digits10;
}

关于这些常量的含义,参见std::numeric_limits :

  • digits10 – 可以不改变地表示的小数位数,
  • max_digits10 – 区分所有此类值所需的小数位数。

因此 description 创建了一个小数位数较少的字符串。那字符串可以转换为 Double 并返回给字符串同样的结果。debugDescription 创建一个包含更多小数位的字符串,这样任何两个不同的浮点值都会产生不同的输出。

关于swift - 为什么 double 在字典中的打印方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40959254/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com