我有两个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
答案 0 :(得分:8)
对于非负整数,以下函数给出 纯整数运算中的所需结果:
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)
}
(我没有测试哪个版本更快。)
答案 1 :(得分:3)
看马丁的回答!他的想法很棒,所以我扩展他的负数解决方案
func divideAndRound(n: Int, _ d: Int) -> Int {
let sn = n < 0 ? -1 : 1
let sd = d < 0 ? -1 : 1
let s = sn * sd
let n = n * sn
let d = d * sd
return (2 * n + d)/(2 * d) * s
}
divideAndRound(1, 2) // 1
divideAndRound(1, 3) // 0
divideAndRound(-1, 2) // -1
divideAndRound(-1, 3) // 0
divideAndRound(1, -2) // -1
divideAndRound(1, -3) // 0
唯一的麻烦是(2 * n + d)可能会溢出而代码会崩溃。
更新!借助儿童数学
func divr(a: Int, _ b: Int)->Int {
return (a % b) * 2 / b + a / b
}
它应该适用于任何Int :-)除了0分母。