IOS功能(NSDecimalNumber) ----- NSD

2022-01-21  本文已影响0人  ShawnAlex

先看一个例子

例子

  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为小数点后面截取位数

完整代码

    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
上一篇下一篇

猜你喜欢

热点阅读