在 Swift 中舍入一半

ozg*_*gur 2 rounding swift

Swift 中的舍入模式是否与Java 中的ROUND_HALF_DOWN行为相同?

舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下向下舍入。如果丢弃的分数 > 0.5,则行为与 RoundingMode.UP 相同;否则,行为与 RoundingMode.DOWN 相同。

例子:

  • 2.5 向下舍入到 2.0
  • 2.6 舍入到 3.0
  • 2.4 向下舍入到 2.0

对于负数:

  • -2.5 向上舍入到 -2.0
  • -2.6 向下舍入到 -3.0
  • -2.4 向上舍入到 -2.0

Mar*_*n R 5

有 - 据我所知 - noFloatingPointRoundingRule与 Java 的行为相同ROUND_HALF_DOWN,但您可以通过rounded()andnextDown或 or的组合获得结果nextUp

func roundHalfDown(_ x: Double) -> Double {
    if x >= 0 {
        return x.nextDown.rounded()
    } else {
        return x.nextUp.rounded()
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

print(roundHalfDown(2.4)) // 2.0
print(roundHalfDown(2.5)) // 2.0
print(roundHalfDown(2.6)) // 3.0

print(roundHalfDown(-2.4)) // -2.0
print(roundHalfDown(-2.5)) // -2.0
print(roundHalfDown(-2.6)) // -3.0
Run Code Online (Sandbox Code Playgroud)

或者作为通用扩展方法,以便它可以与所有浮点类型 ( Float, Double, CGFloat) 一起使用:

extension FloatingPoint {
    func roundedHalfDown() -> Self {
        return self >= 0 ? nextDown.rounded() : nextUp.rounded()
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

print((2.4).roundedHalfDown()) // 2.0
print((2.5).roundedHalfDown()) // 2.0
print((2.6).roundedHalfDown()) // 3.0

print((-2.4).roundedHalfDown()) // -2.0
print((-2.5).roundedHalfDown()) // -2.0
print((-2.6).roundedHalfDown()) // -3.0
Run Code Online (Sandbox Code Playgroud)