Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基础:为什么Int64.max和Double(Int64.max)在Swift iOS SDK中打印两个完全不同的值_Ios_Swift_Foundation - Fatal编程技术网

基础:为什么Int64.max和Double(Int64.max)在Swift iOS SDK中打印两个完全不同的值

基础:为什么Int64.max和Double(Int64.max)在Swift iOS SDK中打印两个完全不同的值,ios,swift,foundation,Ios,Swift,Foundation,这是我的Swift密码 print("\(Int64.max)") print("\(Double(Int64.max))") 它产生以下输出 9223372036854775807 9.223372036854776e+18 为什么这两个值完全不同 9.223372036854776e+18-9223372036854775807=193 FYI您在输出中看到的Double值只是一些有效数字的近似值。我们可以通过String(格式:) 这张照片是: 9

这是我的Swift密码

print("\(Int64.max)")
print("\(Double(Int64.max))")
它产生以下输出

9223372036854775807

9.223372036854776e+18

为什么这两个值完全不同
9.223372036854776e+18-9223372036854775807=193 FYI

您在输出中看到的
Double
值只是一些有效数字的近似值。我们可以通过
String(格式:)

这张照片是:

9223372036854775808.0
所以事实上,差别并不像你说的那么大(193)。只是差1

为什么会有区别

Double
使用浮点表示法存储值。它可以表示广泛的数字,但不是该范围内的所有数字
Double
使用53位尾数、1位符号位和11位存储指数。尾数表示数字的有效位数,指数告诉您小数点的位置。小数点一侧的一切表示2的正幂,另一侧的一切表示2的负幂。例如:

0.1010000    0010
  mantissa    exponent
指数表示将小数点向右移动3次,因此尾数变为
010.10000
。左边的
1
表示2,右边的1表示一半(2^-1),所以这个浮点数表示数字2.5


要表示
Int64.max
(2^63-1),需要63位尾数全部为1,指数中的值为63。但是,
Double
没有那么多尾数!所以它只能是近似的
Int64.max+1
实际上可以用
Double
表示,因为它等于
2^63
。您只需要一个
1
,尾数后面跟着52个
0
s,指数就可以存储
64
。这就是Double所做的。

它们是一样的。一种是使用科学符号,我不会说它们“完全”不同。他们很接近,不是吗?回答了你的问题吗?不,他们不同。。。差别是193。。。。9.223372036854776e+18-9223372036854775807=193FYI@Sweeper对它确实回答了这个问题。。。但我还是有点困惑,很好的解释。如果您想了解有关浮点表示的更多信息。您可以阅读以下内容:
0.1010000    0010
  mantissa    exponent