iOS 四种四舍五入方法总结


/**

     方法1:1.275和1.255保留2位小数四舍五入没有问题。

     但是1.285,1.385,1.485等都有问题,保留2位小数为1.28,1.38,1.48

     */

NSString *FormatStringDecimalByMultiplier(NSString* number,int decimal) {

    if(number.length==0) {

        return@"";

    }

    if(!number.isPureNumText) {

        // 如果不是纯数字,则直接返回

        returnnumber;

    }

    if([numberisEqualToString:@"-"] || [numberisEqualToString:@"/"] || !number.length) {

        returnnumber;

    }

    if([numberdoubleValue] ==0) {

        number =@"0";

    }

    NSString* deci = [NSStringstringWithFormat:@"%df",decimal];

    NSString* format = [NSStringstringWithFormat:@"%%.%@",deci];

    NSNumberFormatter* numberFormat = [[NSNumberFormatter alloc] init];

//  不加.f [NSString stringWithFormat:format,0] 的结果是整数位有几十位。。。

    numberFormat.positiveFormat= [NSStringstringWithFormat:format,0.f];

    NSString*result = [numberFormatstringFromNumber:@(number.doubleValue)];

    return result;

}

    NSString *mount = @"1.285";

    NSString *temp = FormatStringDecimal(mount, 1);

    NSLog(@"*****temp1=%@", temp); // 输出 1.3

    temp = FormatStringDecimal(mount, 2);

    NSLog(@"*****temp2=%@", temp); // 输出 1.28,有问题

    temp = FormatStringDecimal(mount, 3);

    NSLog(@"*****temp3=%@", temp); // 输出 1.285


方法2:1.285、1.585 和 1.255、1.355等有问题,保留2位小数时,分别为1.28、1.58 和 1.25、1.35

    NSLog(@"*****mount1=%.1f", mount.doubleValue); // 输出 1.3

    NSLog(@"*****mount2=%.2f", mount.doubleValue); // 输出 1.28,有问题

    NSLog(@"*****mount3=%.3f", mount.doubleValue); // 输出 1.285

方法3:1.255; 有问题,保留2位小时候时为1.25;另外四舍五入为整数时,没有保留小数.00,直接为2

NSString*FormatFloatDecimal(double number,int decimal) {

    NSDecimalNumberHandler* roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:decimal raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];

    NSDecimalNumber *decimalNumber = [[[NSDecimalNumber alloc] initWithDouble:number] decimalNumberByRoundingAccordingToBehavior:roundingBehavior];

//    NSLog(@"FormatFloatDecimal: %@", [NSString stringWithFormat:@"%f", decimalNumber.doubleValue]);

    return decimalNumber.stringValue;

}

    doubledata = 1.255;

    NSString *tempData = FormatFloatDecimal(data, 1);

    NSLog(@"*****tempData1=%@", tempData);  // 输出 1.3

    tempData = FormatFloatDecimal(data, 2);

    NSLog(@"*****tempData2=%@", tempData); // 输出 1.25,有问题

    tempData = FormatFloatDecimal(data, 3);

    NSLog(@"*****tempData3=%@", tempData); // 输出 1.255

参数含义:

roundingMode四舍五入模式,有四个值: NSRoundUp, NSRoundDown, NSRoundPlain, and NSRoundBankers

scale结果保留几位小数

raiseOnExactness发生精确错误时是否抛出异常,一般为NO

raiseOnOverflow发生溢出错误时是否抛出异常,一般为NO

raiseOnUnderflow发生不足错误时是否抛出异常,一般为NO

raiseOnDivideByZero被0除时是否抛出异常,一般为YES

NSRoundPlain:四舍五入

NSRoundDown:只舍不入

NSRoundUp:只入不舍

NSRoundBankers: 在四舍五入的基础上加了一个判断:当最后一位为5的时候,只会舍入成偶数。比如:1.25不会返回1.3而是1.2,因为1.3不是偶数。

参数含义   value1value2value3value4value5

OriginValue原始数值1.2  1.21  1.25  1.35  1.27

NSRoundPlain           1.2  1.2    1.3     1.4    1.3

NSRoundDown          1.2  1.2   1.2      1.3   1.2

NSRoundUp               1.2  1.3   1.3      1.4   1.3

NSRoundBankers      1.2  1.2   1.2      1.4   1.3


 方法4: 默认保留整数位,可通过以下方式保留2位小数,也有问题,比如1.255、1.265、1.275,结果为1.25、1.26、1.27

    doubleresult = round(1.255*100)/100;

    NSLog(@"*****result=%lf", result); // 输出 1.25,有问题


综上,苹果提供的几种四舍五入方法,都会有些问题。综合比较,还是建议采用 方法1和方法3两种方法。

以上总结如有问题,欢迎大家评论予以指正,谢谢。

你可能感兴趣的:(iOS 四种四舍五入方法总结)