2017-05-22 73 views
3

我想回到Double中最接近的一半。例如,如果號碼是3.76,我希望它四捨五入爲4。另一方面,如果數字是3.74,我希望它翻轉爲3.5這是將Double舍入四捨五入的好實現嗎?

我想出了這個代碼:

extension Double { 
    func roundToClosestHalf() -> Double { 
     let upperLimit = ceil(self) 
     let difference = upperLimit - self 
     if difference <= 0.25 { 
      return ceil(self) 
     } else if difference > 0.25 && difference < 0.75 { 
      return upperLimit - 0.5 
     } else { 
      return floor(self) 
     } 
    } 
} 

是否有更有效的/更好的方式來做到這一點?

let x = 3.21.roundToClosestHalf() // 3 

回答

10

地圖N→N * 2,圓形,地圖N→N/2。

extension Double{ 
    func roundToClosestHalf() -> Double { 
     return (self*2).rounded()/2 
    } 
} 
0

更新:地板只(感謝羅布的警告)

下面是一個較短的版本:

extension Double{ 
    func roundToClosestHalf() -> Double{ 
     return Double(Int(self*2))/2 
    } 
} 
+0

這將返回3.76錯誤值。 'Int.init'截斷;它不輪。 –

+0

返回3.5在操場上,怎麼樣? – hurturk

+0

「如果數字是3.76我希望它被舍入爲4」 –