思い立ったが吉日!

iOSが好きです。

丸め処理を扱う

丸め処理をカスタマイズし、正確に計算する

NSDecilmalNumberクラスNSNumberクラスのサブクラスで、10進数の四則演算を提供する。 丸め処理を行うようなときは四則演算子を使うのではなくきちんとNSDecimalNumberクラスに変換して計算する。

今回は0~255で表されたカラーコードnumが引数として渡り、iOS用の色表現の0.00~1.00で返すメソッドを例として示す。

+(float)decimalCal:(int)colorCode {
    // 計算したい数字を各々decimalに変換
    NSDecimalNumber *decimalColor = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d", colorCode]];
    NSDecimalNumber *decimal255 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d", 255]];
    
    // 割り算を実行 (分子 decimalNumberByDividingBy 分母)
    NSDecimalNumber *answer = [decimalColor decimalNumberByDividingBy:decimal255];
    
    //小数点以下2桁まで表示
    int scale = 2;
    
    //NSRoundPlainで四捨五入を指定 (切り捨てはNSRoundDown)
    NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:scale raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE];
    
    // 四捨五入を実行
    NSNumber *ans = [answer decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
    
    // 最期float型に変換して返す
    return ans.floatValue;
}