除以int并在Objective-C中四舍五入


69

我有2个int。如何将彼此分开,然后取整?


12
这是一个非常基本的问题,但这是合理的。整数除法并不总是像人们期望的那样表现。
乔纳森·格林斯潘

3
我知道这听起来很la脚,但是我为不同的Objective-C数据类型而苦恼,因为您可以在.net中进行自动强制转换
Slee

Answers:


203

如果您的整数是AB并且想要ceil(A / B),则只需计算即可(A+B-1)/B


1
我已经看过很多次了。这是一个值得记住的好模式。
Ferruccio

1
我不认为这在所有情况下都有效。(6 + 2 - 1)/ 2 = 3.5,这是因为它们是整数为3,即没有四舍五入像问题问,回答在这种情况下应该是4
odyth

35
@odyth:6除以2是3
user1122069

您不将6和2相除,因为您必须将它们相加并减去1。因此(6 + 2-1)/ 2 =>(8-1)/ 2 => 7/2 = 3.5
截至2012年

@odyth:在整数算术3.5中为3。当然,OP仅在需要时才需要取整-6/2 = 3 =(6 +
2-1

37

关于什么:

float A,B; // this variables have to be floats!
int result = floor(A/B); // rounded down
int result = ceil(A/B); // rounded up

1
当然不能为两个整数工作吗?因为除法将返回一个int结果。但是对于两个浮点数,将其转换为int(这就是我现在所需要的),这是正确的。
亚当

感谢您指出A和B必须浮动!救了我
莫娜

4
-(NSInteger)divideAndRoundUp:(NSInteger)a with:(NSInteger)b
{
  if( a % b != 0 )
  {
    return a / b + 1;
  }
  return a / b;
}

2
由于该语言的return a / b + (a % b != 0)
布尔值

请注意,尽管这种情况很好,但BOOL不一定是1和0。它们是“ 0”和“ not 0”
James Webster

@Howard的解决方案可能更高效且数学上更简单,但我更喜欢这种解决方案。对于那些在条件和分支计算而不是代数对等方面进行思考的美国程序员来说,其意图和方法更加清晰。;-)
Slipp D. Thompson

4

与在C语言中一样,可以将两者都强制转换为浮点数,然后使用将浮点数作为输入的舍入函数舍入结果。

int a = 1;
int b = 2;

float result = (float)a / (float)b;

int rounded = (int)(result+0.5f);
i

2
无需强制转换为浮点数-有更简单易用的纯整数解决方案-例如,参见@Howard的答案
Paul R

好点-我错过了“综述”部分。Howard's是一个非常优雅的解决方案+1
Nathan Garabedian

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.