我有两个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的情况下四舍五入到最接近的数字
对于非负整数,以下函数以纯整数算术给出所需的结果:
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)
}
(我没有测试哪个版本更快。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句