一尘不染

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

swift

我有两个Int值(它们必须是Ints),我希望它们在方程式中四舍五入到最接近的值;

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

Example = (secondExample / 7000)

该方程使变量Example始终向下舍入到最小值。例如,以下数字表示;

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

Example = (20000 / 7000)

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

我如何Example舍入到最接近的数字 而不将其更改为Double


阅读 224

收藏
2020-07-07

共1个答案

一尘不染

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

func divideAndRound(numerator: Int, _ denominator: Int) -> Int {
    return (2 * numerator + denominator)/(2 * denominator)
}

例子:

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)

这个想法是

 a   1   2 * a + b
 - + - = ---------
 b   2     2 * b

这是任意签名的整数的一种可能实现,该整数也不会溢出:

func divideAndRound(num: Int, _ den: Int) -> Int {
    return num / den + (num % den) / (den / 2 + den % 2)
}

(基于@ 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)
}

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

2020-07-07