先看一个例子
例子
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