似乎Swift中的整数除法向零舍入而不是向较低的数字舍入。这意味着,例如,-1 / 2
将为0而不是-1。
有没有办法让斯威夫特转向更低的数字?我知道我怎么能"模拟"它,但如果有本机解决方案,我宁愿使用它。
答案 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)
我所拥有的备份解决方案涉及一个新的运算符-/
。数学并不涉及在双精度和整数之间来回移动,这避免了一些具有非常大数的边缘情况。另一方面,如果denominator
和numerator
都是非常大的负数,这可能会溢出,而且如果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
函数,并用它来实现运算符。