有时候我们会遇到处理各种保留小数点后几位浮点数的情况,例如有一个浮点数pi=3.141592,我们需要保留小数点后三位,如果是简单的四舍五入就会很好处理,
NSString *str = [NSString stringWithFormat:@"%.3f", pi];
这样得到的结果就是:3.142
但是有时候我们不需要四舍五入的结果,只要它“只舍不进”。
NSDecimalNumber是iOS系统的api,是一种精确计算。主要解决以下问题:
1、字符串转float等不精确问题。
2、精确计算
3、保留小数位数
4、四舍五入及其它的保留小数位数规则
-(NSString *)notRounding:(float)number afterPoint:(int)position{
NSDecimalNumberHandler* roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundUp scale:position
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];
NSDecimalNumber *ouncesDecimal;
NSDecimalNumber *roundedOunces;
ouncesDecimal = [[NSDecimalNumber alloc] initWithFloat: number];
roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior: roundingBehavior];
return [NSString stringWithFormat:@"%@", roundedOunces];
}
NSDecimalNumberHandler初始化时的关键参数:
①、decimalNumberHandlerWithRoundingMode:NSRoundDown,
NSRoundDown代表的就是 “向下保留”(只舍不入),
NSRoundUp代表的就是“向上保留”(只进不舍),
NSRoundPlain代表的就是“四舍五入”,
NSRoundBankers代表的就是:
if(四舍五入位==5){
if(5后有非0数字){//如:1.251 - 1.26
入
}else{//如:1.25 - 1.25
舍
}
}else{
四舍五入
}
②、scale的参数position:保留小数点后几位。
介绍完参数后,我们看看上面代码对浮点数pi 向上保留小数点后3位的处理结果是3.141。
如果decimalNumberHandlerWithRoundingMode:NSRoundUp, 结果就是3.142。
顺带介绍两个系统系带的方法
ceil( ) “向上取整”:返回大于或者等于指定表达式的最小整数
floor( ) “向下取整”:返回小于或者等于指定表达式的最大整数