题目:
把 x 数字精确到小数点后第 p 位,不足 p 位补 0,然后四舍五入
用Objective-C实现:
///把 x 数字精确到小数点后第 p 位,不足 p 位补 0,然后四舍五入 - (NSString *)number:(NSString *)x preciseDecimal:(NSUInteger)p { // 四舍五入 NSDecimalNumberHandler* roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:p raiSEOnExactness:NO raiSEOnOverflow:NO raiSEOnUnderflow:NO raiSEOnDivideByZero:NO]; NSDecimalNumber *ouncesDecimal = [[NSDecimalNumber alloc] initWithDouble:[x doubleValue]]; NSDecimalNumber *roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior]; // 生成需要精确的小数点格式, // 比如精确到小数点第3位,格式为“0.000”;精确到小数点第4位,格式为“0.0000”; // 也就是说精确到第几位,小数点后面就有几个“0” NSMutableString *formatterString = [NSMutableString stringWithString:@"0."]; for (NSInteger i = 0; i < p; ++i) { [formatterString appendString:@"0"]; } NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; // 设置生成好的格式, [formatter setPositiveFormat:formatterString]; // 然后把这个number 对象格式化成我们需要的格式, // 最后以string 类型返回结果。 return [formatter stringFromNumber:roundedOunces]; }
用swift实现:
///把 x 数字精确到小数点后第 p 位,不足 p 位补 0,然后四舍五入 func preciseDecimal(x : String,p : Int) -> String { // 为了安全要判空 if (Double(x) != nil) { // 四舍五入 let decimalNumberHandle : NSDecimalNumberHandler = NSDecimalNumberHandler(roundingMode: NSDecimalNumber.RoundingMode(rawValue: 0)!,scale: Int16(p),raiSEOnExactness: false,raiSEOnOverflow: false,raiSEOnUnderflow: false,raiSEOnDivideByZero: false) let decimaleNumber : NSDecimalNumber = NSDecimalNumber(value: Double(x)!) let resultNumber : NSDecimalNumber = decimaleNumber.rounding(accordingToBehavior: decimalNumberHandle) // 生成需要精确的小数点格式, // 比如精确到小数点第3位,格式为“0.000”;精确到小数点第4位,格式为“0.0000”; // 也就是说精确到第几位,小数点后面就有几个“0” var formatterString : String = "0." let count : Int = (p < 0 ? 0 : p) for _ in 0 ..< count { formatterString.append("0") } let formatter : NumberFormatter = NumberFormatter() // 设置生成好的格式,NSNumberFormatter 对象会按精确度自动四舍五入 formatter.positiveFormat = formatterString // 然后把这个number 对象格式化成我们需要的格式, // 最后以string 类型返回结果。 return formatter.string(from: resultNumber)! } return "0" }