非打印状态下保留两位小数点的float数据方法

原创
2016/12/08 19:21
阅读数 138

最近快被iOS的四舍五入的问题给烦死了,不是说他的四舍五入不好用,而是这个四舍五入有时可能不是四舍五入,而是四舍六入。

先说一下我最后确定使用的方法:

 

-(float)roundFloat:(float)price{

    return (floorf(price*100 + 0.5))/100;

}

 

或则:

    

//    float a = 12.135;

//    a = ceilf(a * 100 + 0.5) / 100;

 

这个基本能够确保最后是四舍五入并且能保留两位小数。

下面再说说这个曲折的过程,首先我想到的是用ios里面自带的roud方法,

 

-(float)roundFloat:(float)price{

    return roundf(price);

}

但是如下举例

 

float test = 23.625;

float test2 = 23.6250;

float test3 = 23.6251;

test = [self roundFloat:test];

test2 = [self roundFloat:test2];

test3 = [self roundFloat:test3];

    

NSLog(@"test:%.2f",test);

NSLog(@"test2:%.2f",test2);

NSLog(@"test3:%.2f",test3);

得出结果:

 

test:24.00

test2:24.00

test3:24.00

 

很显然不是我想要的效果,然后改方法

 

-(float)roundFloat:(float)price{

    return roundf(price*100)/100;

}

 

这个方法貌似可用,但是之前我不知道造了什么数据,恍惚之间觉得它好像也有问题,再看另外一个方法

 

 

-(float)roundFloat:(float)price{

    NSString *temp = [NSString stringWithFormat:@"%.7f",price];

    NSDecimalNumber *numResult = [NSDecimalNumber decimalNumberWithString:temp];

    NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler

                                       decimalNumberHandlerWithRoundingMode:NSRoundBankers

                                       scale:2

                                       raiseOnExactness:NO

                                       raiseOnOverflow:NO

                                       raiseOnUnderflow:NO

                                       raiseOnDivideByZero:YES];

    return [[numResult decimalNumberByRoundingAccordingToBehavior:roundUp] floatValue];

}

 

用这个方法格式化上面的浮点数结果如下:

 

 test:23.62

 test2:23.62

 test3:23.63

可以看到test ,test2 没有做四舍五入,只有 test3 是四舍五入了,从数据上分析,不难发现,原因是test3里面的第三个小数位后面有一个1,而test及test2后面没有小数位或者为0,所以就没有进行四舍五入。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部
返回顶部
顶部