[Objective-C] 小数点を丸める!(数値変換)
公開日:
:
最終更新日:2014/08/20
iPhone App 開発, Objective-C
Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524
小数点を含む数値
Objective-Cに限らず、小数点を含む数値を計算する場合はdoubleやfloatなどを使用した誤差が生じることがあります。
詳しくは以下のリンクを参考に。
http://msdn.microsoft.com/ja-jp/library/c151dt3s(v=vs.80).aspx
厳密な計算はNSDecimalNumberを使用します。その上で、浮動小数点がある場合には小数点を丸める処理が必要です。
文字列から指定の小数点で丸める
+ (NSDecimalNumber *)convertScaleWithDecimalNumber:(NSString *)aNumber scale:(NSInteger)aScale
{
if (aNumber == nil) return [[NSDecimalNumber alloc] initWithString:@"0"];
NSDecimalNumber *decimalValue = [[NSDecimalNumber alloc] initWithString:aNumber];
NSDecimalNumberHandler *roundingStyle = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:aScale
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];
return [decimalValue decimalNumberByRoundingAccordingToBehavior:roundingStyle];
}
3行目:文字列チェックをし、nilの場合は0を返却します。
4行目:文字列をNSDecimalNumberに変換します。
5〜10行目:decimalNumberHandlerWithRoundingModeで数値を丸めます。
| 第1引数 | roundingMode | 丸めモードNSRoundPlain:四捨五入 NSRoundDown:切り下げ NSRoundUp:切り上げ |
| 第2引数 | scale | 丸めた結果の桁数 |
| 第3引数 | raiseOnExactness | 精度が狂った場合、エラーを発生させるか |
| 第4引数 | raiseOnOverflow | オーバーフロー場合、エラーを発生させるか |
| 第5引数 | raiseOnUnderflow | アンダーフローした場合、エラーを発生させるか |
| 第6引数 | raiseOnDivideByZero | 0で除算した場合、エラーを発生させるか |
数値から指定の小数点で丸める
+ (NSDecimalNumber *)getScaleWithDecimalNumber:(NSDecimalNumber *)aNumber scale:(NSInteger)aScale
{
NSDecimalNumberHandler *roundingStyle = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:aScale
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];
return [aNumber decimalNumberByRoundingAccordingToBehavior:roundingStyle];
}
ad
関連記事
-
-
NSDateを5分刻み・15分刻みで丸める
NsDateを初期値としてUIDatePicker等に設定する場合、日付の丸め処理が必要になるのでメ
-
-
[iPhone App] WorkManager 1.2.0版がリリースされました。
新機能 以前から要望などが多かったものを元に、機能を追加いたしました。 新バージョンで追加された
-
-
[Objective-C] UINavigationControllerのセグエを使って画面遷移をする
画面遷移の実装 今回はUINavigationControllerを使って画面遷移をしたいと思いま
-
-
[iPhone App]WorkManager アップデートしました。
Processing For App Storeでやきもきした僕です。こんにちわ。 今
-
-
[Swift] UITabBarControllerでタブ選択時のイベントを取得する
UITabBarController タブを使った画面を作成する場合はUITabBarContro
-
-
[Swift] スクリーンサイズを取得する
スクリーンサイズを取得 iPhoneの幅と高さを取得する関数を紹介します。 iOS8から画面の傾
-
-
[Swift] CoreDataのテーブルからデータ件数を取得する
件数を取得する fetchResultsControllerなどを使わず、直接テーブルのデータ件数
-
-
[Objective-C] no architectures to compile for … のコンパイルエラーについて
起動したプロジェクトでコンパイルエラーが出ました。 no architectures to com