例如有一个浮点数pi=3.141592,我们需要保留小数点后三位,如果是简单的四舍五入就会很好处理,
NSString *str = [NSString stringWithFormat:@"%.3f", pi];
这样得到的结果就是:3.142
但是有时候我们不需要四舍五入的结果,只要它“只舍不进”。
NSDecimalNumber是iOS系统的api,是一种精确计算。主要解决以下问题:
1、字符串转float等不精确问题。
2、精确计算
3、保留小数位数
4、四舍五入及其它的保留小数位数规则
/*
* number 需处理的数据
*position 小数点后位数
*/
-(NSString*)notRounding:(float)number afterPoint:(int)position{
NSDecimalNumberHandler* roundingBehavior = [NSDecimalNumberHandlerdecimalNumberHandlerWithRoundingMode:NSRoundUpscale:positionraiseOnExactness:NOraiseOnOverflow:NOraiseOnUnderflow:NOraiseOnDivideByZero:NO];
NSDecimalNumber*ouncesDecimal;
NSDecimalNumber*roundedOunces;ouncesDecimal = [[NSDecimalNumberalloc] initWithFloat: number];roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior: roundingBehavior];
return[NSStringstringWithFormat:@"%@", 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( ) “向下取整”:返回小于或者等于指定表达式的最大整数