首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整数除法在C#中的四舍五入(用于负数)

问整数除法在C#中的四舍五入(用于负数)
EN

Stack Overflow用户
提问于 2019-03-16 11:22:01
回答 2查看 1.6K关注 0票数 4

有没有任何方法可以在C#中执行整数除法(没有浮点数或小数点,我需要保持这个整数除法非常快)?

默认的除法只会丢弃分数参数。考虑:

代码语言:javascript
复制
 1 / 2 = 0 // That is correct
-1 / 2 = 0 // ... but I want to get (-1) here!

我的部门对分红将取正数和负数。我不需要使用if,因为分支将过于昂贵(操作将在实时游戏引擎中非常频繁地运行).

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-16 12:15:27

除以2是一个简单的按位右移.在@elgonzo(现在删除)提到C#的rightshift的属性之后,我决定看看它是如何工作的,它似乎做了您想做的事情:

代码语言:javascript
复制
var result = number >> 1;

这产生了以下结果:

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

分支版本的性能似乎与模块化版本差不多:比简单的rightshift慢得多。

票数 4
EN

Stack Overflow用户

发布于 2019-03-16 11:35:35

如果要将a除以b

--不会因为溢出而失败的方法:

代码语言:javascript
复制
int res = a / b;
return (a < 0 && a != b * res) ? res - 1 : res;

以下方法可能由于负溢出而失败.

代码语言:javascript
复制
int mod = a % b;
if (mod < 0) {
  mod += b;
}
return (a - mod) / b;

与mod += b混淆,因为a % b可能是负的。较短的方式:

代码语言:javascript
复制
return (a - (a % b + b) % b) / b;

更清楚的是:

代码语言:javascript
复制
return a >= 0 ? a / b : (a - b + 1) / b;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55196178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档