我想用Int范围生成一个包含所有整数和.5
值的数组。
结果想要:
min value = 0
max value = 5
generated Array = [0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
我知道如何只得到整数值:
Array(0...5)
但不是这个浮动值... 我觉得很清楚,有人有想法吗?
答案 0 :(得分:10)
将Array()
与stride(from:through:by:)
:
let arr = Array(stride(from: 0, through: 5, by: 0.5))
print(arr)
[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]
如果您的min
和max
值确实为Int
,那么您需要将它们转换为Double
:
let min = 0
let max = 5
let step = 0.5
let arr = Array(stride(from: Double(min), through: Double(max), by: step))
警告:强>
由于nature of floating point math,如果步骤或端点不能精确表示为二进制浮点数,则可能会导致意外结果。
@MartinR举了一个例子:
let arr = Array(stride(from: 0, through: 0.7, by: 0.1))
print(arr)
[0.0, 0.10000000000000001, 0.20000000000000001, 0.30000000000000004, 0.40000000000000002, 0.5, 0.60000000000000009]
排除了端点0.7
,因为该值略高于它。
您可能还想考虑使用map
生成数组:
// create array of 0 to 0.7 with step 0.1
let arr2 = (0...7).map { Double($0) / 10 }
这样可以保证捕获端点0.7
(好吧,它的近似值)。
所以,对于你原来的例子:
// create an array from 0 to 5 with step 0.5
let arr = (0...10).map { Double($0) / 2 }