向负无穷大舍入负整数商

时间:2014-09-16 03:36:36

标签: swift rounding

似乎Swift中的整数除法向零舍入而不是向较低的数字舍入。这意味着,例如,-1 / 2将为0而不是-1。

有没有办法让斯威夫特转向更低的数字?我知道我怎么能"模拟"它,但如果有本机解决方案,我宁愿使用它。

3 个答案:

答案 0 :(得分:1)

您可以像这样定义自己的运算符:

infix operator </> { associativity left }
func </> (a: Int, b: Int) -> Int {
    return Int(floor(Double(a) / Double(b)))
}

这样您就不必输入那个荒谬的表达方式。我提议</>,但你当然可以自己选择。

如果您不喜欢创建运算符,请将其用作普通函数:

func div (a: Int, b: Int) -> Int {
    return Int(floor(Double(a) / Double(b)))
}

最后,但我个人使用它,您可以重新定义除法运算符

func / (a: Int, b: Int) -> Int {
    return Int(floor(Double(a) / Double(b)))
}

在这种情况下,它将适用于所有部门 - 但要注意副作用

答案 1 :(得分:0)

楼层功能向下舍入,所以如果你floor(Float(a)/Float(b))它应该工作。

答案 2 :(得分:0)

我所拥有的备份解决方案涉及一个新的运算符-/。数学并不涉及在双精度和整数之间来回移动,这避免了一些具有非常大数的边缘情况。另一方面,如果denominatornumerator都是非常大的负数,这可能会溢出,而且如果denominator为负数,我不确定会发生什么。

infix operator -/ {
   precedence 150
   associativity left
}

func -/ (numerator: Int, denominator: Int) -> Int {
   if numerator < 0 {
       return (numerator - (denominator - 1)) / denominator
   }
   return numerator / denominator
}

如果你想模仿C行为,任何用Swift编写的解决方案都可能最终会遇到问题。另一种可能性是在桥接头中包含一个微小的divide函数,并用它来实现运算符。