IOS功能(NSDecimalNumber) ----- NSDecimalNumber运算保留小数位数

先看一个例子

例子

  NSString *a = @"103999";
  double c = [a doubleValue];
  NSLog(@"结果: %@", [NSString stringWithFormat:@"%f w", c / 10000.f]);
结果

那么我们保留1位小数, 看一下

保留结果


目标

我们想要得到一个 10.3 的一个小数。

之前的例子看出结果不正确, 被五入了, 但是我们有些情况下只需要截取小数点后1位不需要四舍五入。那么OC中高精度运算肯定要用 NSDecimalNumber处理

NSString *a = @"103999";
NSDecimalNumber *minNum = [NSDecimalNumber decimalNumberWithString:a];
NSDecimalNumber *d = [NSDecimalNumber decimalNumberWithString:@"10000"];
NSDecimalNumber * r = [minNum decimalNumberByDividingBy:d];
NSLog(@"精确结果: %@", r);
NSDecimalNumber处理

可看出运算结果OK没有问题, 那么我们常规取小数点后1位试一试

NSDecimalNumber 取1位小数错误示范

可看到还是被四舍五入, 不满足我们想要的情况。但是我们知道NSDecimalNumber除法都正确, 只在后面截取出现了问题。那么我们看看NSDecimalNumber有没有自带的方法去处理, 那么有

NSDecimalNumberHandler *round = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:1 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];

其中Model为转化模式, 可向上, 向下取整等

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
};

scale为小数点后面截取位数

  • 1: 截取一位
  • 2: 截取两位
    ......

完整代码

    NSString *a = @"103999";
    NSDecimalNumber *minNum = [NSDecimalNumber decimalNumberWithString:a];
    NSDecimalNumberHandler *round = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:1 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
    NSDecimalNumber * res = [minNum decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"10000"] withBehavior:round];

    NSLog(@"精确结果: %@", res);

最终结果

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容