2017-03-11 29 views
-4

我有一個swift代碼塊,其中最後的計算需要四捨五入到預定義數組中的最近數字?你會怎麼做?如何將變量四捨五入到數組中最近的數字?

var array = [8, 23, 31, 46, 54, 69, 77, 92, 100, 115, 123, 138] 
var finalCalculation = 55.5 
//round 55.5 to the nearest number in array which is 54 
+3

你在問錯誤的問題。你並沒有試圖繞過任何東西。您正試圖在數組中找到最接近您的'finalCalculation'數字的數字。 – rmaddy

+2

[編輯]你的問題顯示你已經嘗試過。我們不在這裏爲你做功課。 – rmaddy

+0

我爲你構建了一個完整的答案,但@rmaddy是正確的 - 你需要向我們展示你已經嘗試過什麼,以及什麼不起作用。 – Grimxn

回答

0

我能想出的唯一辦法是遍歷並跟蹤其中一個是最接近和比較,到下一個項目在數組中,但是,我敢肯定,這可以在這裏得到改善:

var array: Array<Double> = [8, 23, 31, 46, 54, 69, 77, 92, 100, 115, 123, 138] 
var finalCalculation: Double = 55.5 

var closest: Double = array[0] 

for item in array { 
    if abs(finalCalculation - item) < abs(finalCalculation - closest) { 
     closest = item 
    } 
} 

print(closest) 

ABS部分是確保你得到的數字之間的距離。

0
var result = array.reduce(100, { x, y in 
    abs(Double(x) - finalCalculation) > abs(Double(y) - finalCalculation) ? y : x 
}) 

'100'是一個任意大的數字,開始減少計算。你可以使用任何你喜歡的,只要它大於finalCalculation和你的答案之間的差異。

+0

您可以選擇任何數組元素(例如第一個)作爲reduce中的初始值。 - 同樣可以用'min(by:...)'表示。 –

+0

你對第一個元素是正確的,雖然我沒有看到這樣做的價值;再次,第一個數字是任意的。 min(by :)是一個好點。自從Swift 3更新以來我沒有使用reduce(),並以此作爲追趕的藉口。 :P – dylanthelion

+0

從數組元素開始的優點是,您不必*猜測足夠大的初始值。 –