浮点类型数据的精度处理方法

有时候我们会遇到处理各种保留小数点后几位浮点数的情况,例如有一个浮点数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(  ) “向下取整”:返回小于或者等于指定表达式的最大整数

你可能感兴趣的:(浮点类型数据的精度处理方法)