iOS 字符串浮点运算及四舍五入处理

2016-11-10  本文已影响234人  herui201211

�需求:�将字符串"12349999"转为字符串"1234.99w"。

首先想到的是先将字符串转为数值,再除去10000,最后拼接字符串。代码如下:

  NSString *ret = [NSString stringWithFormat:@"%.2fw", [@"12349999" longLongValue] / 10000.0];
  NSLog(@"%@", ret);
输出:1235.00w输出:1235.00w

结果居然是这个😱 😱。。我勒个去,,,Xcode你不爱我了吗??

~
~
~

于是,“众里寻它千百度,蓦然回首,那人却在灯火阑珊处。” 发现了这个:
NSDecimalNumber
NSDecimalNumberHandler
看了下大概是�可以对小数进行运算及小数位的舍入处理。ok 开撸!!

    //需要参与运算的两个数
    NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:@"12349999"];
    NSDecimalNumber *w = [NSDecimalNumber decimalNumberWithString:@"10000"];
    
    //运算结果处理:小数精确到后2位,其余位无条件舍弃
    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler
                                       decimalNumberHandlerWithRoundingMode:NSRoundDown//要使用的舍入模式
                                       scale:2             //结果保留几位小数
                                       raiseOnExactness:NO //发生精确错误时是否抛出异常,一般为NO
                                       raiseOnOverflow:NO  //发生溢出错误时是否抛出异常,一般为NO
                                       raiseOnUnderflow:NO //发生不足错误时是否抛出异常,一般为NO
                                       raiseOnDivideByZero:YES];//被0除时是否抛出异常,一般为YES
    
    //将两个数进行除法运算,并对结果加以处理(handler)
    num = [num decimalNumberByDividingBy:w withBehavior:handler];
    NSString *ret = [NSString stringWithFormat:@"%@w", num];
    NSLog(@"%@", ret);
输出:1234.99w输出:1234.99w

搞定收工!!


最后说下当NSRoundingMode取值为NSRoundBankers的时候,代表的是“四舍六入五成双”。 看的几篇博客都没给说说清楚😥 😥 。。

/*************** Type definitions  ***********/

// Rounding policies :
// Original
//    value 1.2  1.21  1.25  1.35  1.27
// Plain    1.2  1.2   1.3   1.4   1.3
// Down     1.2  1.2   1.2   1.3   1.2
// Up       1.2  1.3   1.3   1.4   1.3
// Bankers  1.2  1.2   1.2   1.4   1.3

typedef NS_ENUM(NSUInteger, NSRoundingMode) {
    NSRoundPlain,   // Round up on a tie  ###四舍五入
    NSRoundDown,    // Always down == truncate ###只舍不入
    NSRoundUp,      // Always up ###只入不舍
    NSRoundBankers  // on a tie round so last digit is even ###四舍六入五成双
};

上一篇下一篇

猜你喜欢

热点阅读