题目:
把 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"
}