文系プログラマの勉強ノート

スマホアプリ開発やデザインなどについて勉強したことをまとめています

小数点以下の桁数を指定して四捨五入

データを整理していたら昔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