【问题标题】:Round division to upper integer四舍五入到上整数
【发布时间】:2011-03-11 19:53:07
【问题描述】:
有没有一种简单的方法可以将除法的结果四舍五入到大整数?
我想要这个:
18/20 -> 1
19/20 -> 1
20/20 -> 1
21/20 -> 2
22/20 -> 2
23/20 -> 2
...等等...
38/20 -> 2
39/20 -> 2
40/20 -> 2
41/20 -> 3
42/20 -> 3
43/20 -> 3
我必须管理 NSNumberFormatter 的东西吗?
我没有成功获得一个整数值并进行整数比较。
提前致谢!
【问题讨论】:
标签:
iphone
integer
numbers
rounding
【解决方案1】:
int x, y;
int result = (x + (y-1)) / y;
测试:
int n = 20;
for (int i = 1; i <= 50; i++) {
NSLog(@"%d+(%d-1) / %d = %d", i, n, n, (i+(n-1))/n);
}
【解决方案2】:
您使用 math.h 中可用的标准 ceil() 和 ceilf() 函数
【解决方案3】:
标准 C 支持 double ceil(double x) 和 long double ceill(long double x)。也许 iPhone 有这些?如果您的数据首先是整数,那么您要么必须找到一个聪明的技巧,要么首先将您的整数转换为双精度数。
【解决方案4】:
NSNumberFormatter 用于数字和字符串之间的转换。除了已经提到的原语上的 c 函数之外,您还可以使用 NSDecimalNumber 和 NSDecimalNumberHandler 来执行给定 NSNumber 实例的计算和舍入。如有疑问,请参阅文档。 Number and Value Programming Guide
除法的示例代码,四舍五入到下一个整数并显示结果。
NSDecimalNumber *denominator = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInteger:20] decimalValue]];
NSDecimalNumberHandler *numberHandler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundUp scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
for (NSInteger counter = 1; counter <= 50; counter++) {
NSDecimalNumber *numerator = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInteger:counter] decimalValue]];
NSDecimalNumber *result = [[numerator decimalNumberByDividingBy:denominator withBehavior:numberHandler] retain];
NSLog(@"%@/%@ -> %d", numerator, denominator, [result integerValue]);
[result release];
}