有什么方法可以在C#中执行整数除法(没有浮点数或小数,我需要非常快地保持这一位数)以舍入数字?
默认除法只是丢弃小数参数。考虑:
1 / 2 = 0 // That is correct
-1 / 2 = 0 // ... but I want to get (-1) here!
我的除法将同时使用正数和负数作为除数。我不需要雇用if
,因为分支成本太高(操作将在实时游戏引擎中非常频繁地运行)...
答案 0 :(得分:2)
如果您想将a
除以b
:
不会因溢出而失败的方法:
int res = a / b;
return (a < 0 && a != b * res) ? res - 1 : res;
以下方法可能会由于负溢出而失败。
int mod = a % b;
if (mod < 0) {
mod += b;
}
return (a - mod) / b;
因为mod += b
可能为负,所以与a % b
陷入混乱。
较短的方法:
return (a - (a % b + b) % b) / b;
一个更清晰的例子:
return a >= 0 ? a / b : (a - b + 1) / b;
答案 1 :(得分:2)
除以2是简单的按位右移。在@elgonzo(现在已删除)提到C#右移的属性之后,我决定看一下它是如何工作的,并且似乎可以精确地执行您想要的操作:
<Col md="4">
<FormGroup>
<Label>Have Children</Label>
<CustomInput type="radio" name="customRadio" label="Yes" value="yes" />
<CustomInput type="radio" name="customRadio" label="No" value="no" />
</FormGroup>
</Col>
<Col md="4">
<FormGroup>
<Label>Have Spouse</Label>
...(same as children input)
</FormGroup>
</Col>
<Col md="4">
<FormGroup>
<Label>Have Family Members</Label>
...(same as children input)
</FormGroup>
</Col>
这将产生以下结果:
11-> 5
10-> 5
2-> 1
1-> 0
-1-> -1
-2-> -1
-32-> -16
-33-> -17
int.MaxValue和MinValue也可以。
在性能方面,这似乎几乎是当前接受的使用模运算符的答案的两倍。 在我的机器上,通过简单的移位将100000000个随机数相除(相同)将花费2.17秒,而使用模数的版本将花费3.1至4.0秒。
分支版本的性能似乎与模版本几乎相同:比简单的右移要慢得多。