基础:iOS向上取整、向下取整、四舍五入

最近再工作中发现了个bug,也是自己的一个疏忽吧。在通过数据总条数和每页请求返回条数计算数据分页总数时使用了向上取整的方法计算。由于ceil()中的参数被计算为整型数据了,导致向上取整的结果错误。

问题原因

  • 错误代码:
NSInteger total = 84;
NSInteger count = 40;
//如果直接使用total/count 所得的结过为2,因为两个整型相除结过被默认为是整型了!
NSInteger pageTotal = ceil(total/count);
//此时使用上面的表达式获取向上取整的结过是2,是对整型数据2做的向上取整,使用ceilf()的结过是相同的。
  • 正确代码:
NSInteger total = 84;
NSInteger count = 40;  
//将结果强转为浮点型,result为2.1
CGFloat result = total/count;
//此时向上取整的结过为3,达到预期结过
NSInteger pageTotal = ceil(total/count);

相关方法

向上取整:
float ceilf(float)、double ceil(double)、 long double ceill(long double);
向下取整:
float floorf(float)、double floor(double)、long double floorl(long double);
四舍五入:
float roundf(float)、double round(double)、 long double roundl(long double);

使用方法

CGFloat a = 4.3;
CGFloat ceil = ceilf(a);
CGFloat floor = floorf(a);
CGFloat round = roundf(a);
result log: 向上取整:5.0 向下取整:4.0 四舍五入:4.0

CGFloat b = -4.3;
CGFloat ceil = ceilf(b);
CGFloat floor = floorf(b);
CGFloat round = roundf(b);
result log: 向上取整:-4.0 向下取整:-5.0 四舍五入:-4.0
注意:负数的向上取整和向下取整和正数相反

double c = 5.8;
double ceil = ceil(c);
double floor = floor(c);
double round = round(c);
result log: 向上取整:6.0 向下取整:5.0 四舍五入:6.0

你可能感兴趣的:(基础:iOS向上取整、向下取整、四舍五入)