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的情况下舍入到最接近的数字
对于非负整数,以下函数在纯整数运算中给出了所需的结果:
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)
(我没有测试哪个版本更快.)
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |