C#中的整数除法(对于负数)

时间:2019-03-16 11:22:02

标签: c# math

有什么方法可以在C#中执行整数除法(没有浮点数或小数,我需要非常快地保持这一位数)以舍入数字?

默认除法只是丢弃小数参数。考虑:

 1 / 2 = 0 // That is correct
-1 / 2 = 0 // ... but I want to get (-1) here!

我的除法将同时使用正数和负数作为除数。我不需要雇用if,因为分支成本太高(操作将在实时游戏引擎中非常频繁地运行)...

2 个答案:

答案 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秒。

分支版本的性能似乎与模版本几乎相同:比简单的右移要慢得多。