【问题标题】:Swift array with mixed elements,why return different result具有混合元素的Swift数组,为什么返回不同的结果
【发布时间】:2014-09-17 13:38:55
【问题描述】:
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,你好]

结果不同,谁能解释一下?

【问题讨论】:

  • 浮点精度。计算机只能以一定的精度表示数字。 8.7 和 8.6999999999999 本质上是一样的,不过我只能推测为什么它们的显示不同。
  • 正如@vacawama 所指出的,您可以将此问题简化为“为什么println(NSNumber(double: 8.7))println(Double(8.7)) 会给出不同的结果?”

标签: arrays swift


【解决方案1】:

对于arr1,由于您没有指定类型并且导入了Foundation,Swift 将数组类型设为[NSObject]。那么348.7"hello"的类型分别为NSNumberNSNumberNSString

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

var a: NSNumber = 8.7
println(a)            // prints 8.699999999999999

arr2 中,值的类型为IntDoubleString,因此8.7 的打印结果如您所愿:

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

正如马特·吉布森在 cmets 中所说:

输出不同可能是因为NSNumber的描述方法 将数字格式化为“%0.16g”;如果你这样做 NSString(format: "%0.16g", 8.7) 给你“8.699999999999999”。我敢肯定他们都是同一个“下面”的双重角色。

为了验证它们是相同数字的理论,我做了:

if (arr1[1] as NSNumber).doubleValue == (arr2[1] as Double) {
    println("same")
}

这确实打印了"same"

【讨论】:

  • 我认为输出差异可能是因为NSNumber's description method将数字格式化为“%0.16g”;如果你这样做 NSString(format: "%0.16g", 8.7) 会给你“8.699999999999999”。我敢肯定他们都是同一个“下面”的双重角色。
猜你喜欢
  • 2012-07-20
  • 2012-07-28
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多