使Int四舍五入到最接近的值

Rap*_*arn 2 double int rounding swift

我有两个Int值(它们必须是Ints)并且我希望它们在等式中舍入到最接近的值;

var Example = Int()
var secondExample = Int()

Example = (secondExample / 7000)
Run Code Online (Sandbox Code Playgroud)

该等式使变量Example始终向下舍入到最低值.比如说数字如下;

var Example = Int()
var secondExample : Int = 20000

Example = (20000 / 7000)
Run Code Online (Sandbox Code Playgroud)

20000/7000等于2.857 ......但变量Example显示2.

如何Example不将其更改为Double的情况下舍入到最接近的数字

Mar*_*n R 8

对于非负整数,以下函数在纯整数运算中给出了所需的结果:

func divideAndRound(numerator: Int, _ denominator: Int) -> Int {
    return (2 * numerator + denominator)/(2 * denominator)
}
Run Code Online (Sandbox Code Playgroud)

例子:

print(20000.0/7000.0) // 2.85714285714286
print(divideAndRound(20000, 7000)) // 3 (rounded up)

print(10000.0/7000.0) // 1.42857142857143
print(divideAndRound(10000, 7000)) // 1 (rounded down)
Run Code Online (Sandbox Code Playgroud)

这个想法就是这样

 a   1   2 * a + b
 - + - = ---------
 b   2     2 * b
Run Code Online (Sandbox Code Playgroud)

以下是任意签名整数的可能实现,它也不会溢出:

func divideAndRound(num: Int, _ den: Int) -> Int {
    return num / den + (num % den) / (den / 2 + den % 2)
}
Run Code Online (Sandbox Code Playgroud)

(基于@ user3441734的更新解决方案,所以我们现在的答案之间有一个参考周期:)

还有一个ldiv函数可以计算除法的商和余数,因此最后一个函数也可以实现为

func divideAndRound(num: Int, _ den: Int) -> Int {
    let div = ldiv(num, den)
    let div2 = ldiv(den, 2)
    return div.quot + div.rem / (div2.quot + div2.rem)
}
Run Code Online (Sandbox Code Playgroud)

(我没有测试哪个版本更快.)