小数点以下の桁数を指定して四捨五入
データを整理していたら昔Objective-Cで書いたソースコードが出てきたので、Swiftに書き直してみました。
引数はどちらの言語でも value: 四捨五入する値、scale: 小数点以下の桁数 です。
Objective-C
+ (double)round:(double)value scale:(NSInteger)scale { NSNumber *number = [NSNumber numberWithDouble:value]; NSDecimalNumber *before = [[NSDecimalNumber alloc] initWithString:number.stringValue]; NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:scale raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]; NSDecimalNumber *after = [before decimalNumberByRoundingAccordingToBehavior:handler]; return after.doubleValue; }
Swift
func round(value: Double, scale: Int16) -> Double { let number = value as NSNumber let before = NSDecimalNumber(string: number.stringValue) let handler = NSDecimalNumberHandler(roundingMode: .plain, scale: scale, raiseOnExactness:false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false) let after = before.rounding(accordingToBehavior: handler) return after.doubleValue }
実際に実行すると以下のようになります
let rounded1 = round(value: 123.456, scale: 2) // 123.46 let rounded2 = round(value: 5.4321, scale: 1) // 5.4 let rounded3 = round(value: 7.89, scale: 0) // 8