我有两个Int值(它们必须是Ints),我希望它们在方程式中四舍五入到最接近的值;
var Example = Int() var secondExample = Int() Example = (secondExample / 7000)
该方程使变量Example始终向下舍入到最小值。例如,以下数字表示;
Example
var Example = Int() var secondExample : Int = 20000 Example = (20000 / 7000)
20000/7000等于2.857 …但是变量Example显示2。
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函数可以计算商和除法余数,因此最后一个函数也可以实现为
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) }
(我没有测试哪个版本更快。)