斯威夫特回合减半

时间:2019-03-18 08:08:49

标签: swift rounding

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

5 个答案:

答案 0 :(得分:4)

据我所知–没有FloatingPointRoundingRule的行为与Java的ROUND_HALF_DOWN相同,但是您可以结合使用rounded()和{{1 }}或nextDown

nextUp

示例:

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

或作为通用扩展方法,以便可以与所有浮点类型(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 FloatDouble)一起使用:

CGFloat

示例:

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

答案 1 :(得分:1)

根据Apple

,Swift通过规则实现.round()功能

FloatingPointRoundingRule

case awayFromZero

舍入到最接近允许值,其大小大于或等于源的值。

case down

舍入到小于或等于源的最接近允许值。

case toNearestOrAwayFromZero

舍入到最接近的允许值;如果两个值相等,则选择一个较大的值。

case toNearestOrEven

舍入到最接近的允许值;如果两个值相等,则选择偶数。

case towardZero

舍入到最接近允许值,其大小小于或等于源的大小。

case up

舍入到大于或等于源的最接近允许值。

答案 2 :(得分:0)

是的,您可以使用NSNumberFormatter和RoundingMode做类似的事情

在这里阅读

NSNumberFormatter

RoundingMode

答案 3 :(得分:0)

就像@MohmmadS所说的那样,这些都是内置的舍入方法。

您可以像这样实现自定义舍入:

func round(_ value: Double, toNearest: Double) -> Double {
    return round(value / toNearest) * toNearest
}

func roundDown(_ value: Double, toNearest: Double) -> Double {
    return floor(value / toNearest) * toNearest
}

func roundUp(_ value: Double, toNearest: Double) -> Double {
    return ceil(value / toNearest) * toNearest
}

示例:

round(52.376, toNearest: 0.01) // 52.38
round(52.376, toNearest: 0.1)  // 52.4
round(52.376, toNearest: 0.25) // 52.5
round(52.376, toNearest: 0.5)  // 52.5
round(52.376, toNearest: 1)    // 52

答案 4 :(得分:0)

 var a = 6.54
        a.round(.toNearestOrAwayFromZero)
        // a == 7.0

        var b = 6.54
        b.round(.towardZero)
        // b == 6.0


        var c = 6.54
        c.round(.up)
        // c == 7.0


        var d = 6.54
        d.round(.down)
        // d == 6.0

您也可以这样做,但是还需要取小数点后的值。