如注释中已经提到的,a
Double不能
1.1精确存储值。Swift根据IEEE
754 标准使用(像许多其他语言一样)二进制浮点数。
最接近的数目
1.1可以被表示为
Double是
1.100000000000000088817841970012523233890533447265625
与最接近的数目
2.3可以被表示,作为一个
Double是
2.29999999999999982236431605997495353221893310546875
打印 该数字表示将其再次转换为带有小数表示的字符串,并且以不同的精度完成此操作,具体取决于您如何打印该数字。
从源代码HashedCollections.swift.gyb一个可以看到
description的方法
Dictionary使用
debugPrint()两个键和值,和
debugPrint(x)打印的值
x.debugDescription
(如果
x符合
CustomDebugStringConvertible)。
另一方面,如果符合则
print(x)呼叫。
x.description``x``CustomStringConvertible
所以,你看到的是输出不同
description和
debugDescription的
Double:
print(1.1.description) // 1.1print(1.1.debugDescription) // 1.1000000000000001
从Swift源代码中,可以看到两者都使用Stubs.cpp中的
swift_floatingPointToString()
函数,并且参数分别设置为和。此参数控制数字到字符串转换的精度:
Debug``false``true
int Precision = std::numeric_limits<T>::digits10;if (Debug) { Precision = std::numeric_limits<T>::max_digits10;}有关这些常量的含义,请参见std ::
numeric_limits:
digits10
–可以不改变地表示的小数位数,max_digits10
–区分此类型的所有值所必需的小数位数。
因此,
description创建一个具有较少十进制数字的字符串。该字符串可以转换为a
Double并返回给相同结果的字符串。
debugDescription创建具有更多十进制数字的字符串,以便任何两个不同的浮点值将产生不同的输出。



