这是一个将Double四舍五入到最接近的半数的良好实现吗?

4

我想将一个 Double 类型的数值四舍五入到最接近的 0.5。例如,如果这个数是 3.76,我希望它被四舍五入为 4。另一方面,如果这个数是 3.74,我希望它被四舍五入为 3.5

我想出了以下代码:

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
2个回答

11

将数字N映射到N*2,四舍五入后映射到N/2。

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

0

更新:仅限floor(感谢Rob的提醒)

这是一个更短的版本:

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

这会返回3.76的错误值。Int.init截断而不是四舍五入。 - Rob Napier
在 playground 中返回 3.5,为什么? - hurturk
如果这个数字是3.76,我希望它被四舍五入到4。 - Rob Napier
哦,好的,这更像是一个地板 :) - hurturk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接