var arr1: Array = [34, 8.7, "hello"]
var arr2: Array<Any> = [34, 8.7, "hello"]
println(arr1)
println(arr2)
[34, 8.699999999999999, hello] [34, 8.7, hello]
不同的结果,谁能解释一下?
最佳答案
在 arr1
的情况下,由于您没有指定类型并且您导入了 Foundation
,Swift 将数组类型设为 [NSObject]
。那么,34
、8.7
、"hello"
的类型分别是NSNumber
、NSNumber
和 NSString
分别。
无论出于何种原因,值为 8.7
的 NSNumber
打印为 8.699999999999999
。试试这是一个 Playground :
var a: NSNumber = 8.7
println(a) // prints 8.699999999999999
在 arr2
中,值的类型有 Int
、Double
和 String
,所以 8.7
按您的预期打印:
var b: Double = 8.7
println(b) // prints 8.7
正如马特·吉布森 (Matt Gibson) 在评论中所说:
the output difference may be because NSNumber's description method formats the number as "%0.16g"; if you do NSString(format: "%0.16g", 8.7) gives you "8.699999999999999". I'm sure they're both just the same double "underneath".
为了验证它们在下面是相同数字的理论,我做了:
if (arr1[1] as NSNumber).doubleValue == (arr2[1] as Double) {
println("same")
}
这确实打印了"same"
。
关于arrays - 具有混合元素的Swift数组,为什么返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25892203/