具有混合元素的Swift数组,为什么返回不同的结果

时间:2014-09-17 13:38:55

标签: arrays swift

var arr1: Array = [34, 8.7, "hello"]
var arr2: Array<Any> = [34, 8.7, "hello"]

println(arr1)
println(arr2)
  

[34,8.699999999999999,你好]   [34,8.7,你好]

不同的结果,任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:4)

如果是arr1,由于您没有指定类型并且已导入Foundation,因此Swift创建了数组类型[NSObject]。然后,348.7"hello"的类型分别为NSNumberNSNumberNSString

无论出于何种原因,值为NSNumber的{​​{1}}打印为8.7。试试这是一个游乐场:

8.699999999999999

var a: NSNumber = 8.7 println(a) // prints 8.699999999999999 中,值包含arr2IntDouble类型,因此String按照您的预期打印:

8.7

Matt Gibson在评论中说:

  

输出差异可能是因为NSNumber的描述方法   将数字格式化为&#34;%0.16g&#34 ;;如果你做NSString(格式:&#34;%0.16g&#34;,   8.7)给你&#34; 8.699999999999999&#34;。我确定他们只是同一个双重&#34;在&#34;下面。#/ p>

为了测试它们在下面是相同数字的理论,我做了:

var b: Double = 8.7
println(b)           // prints 8.7

这确实打印了if (arr1[1] as NSNumber).doubleValue == (arr2[1] as Double) { println("same") }