2012-03-29 7 views
0

私はすでにこのような話題に関して多くの異なる質問があることを知っていますが、私はそれらをすべて私の特定のニーズに合わせる方法を見つけることができませんでした。Objective-Cのダイナミックな丸め数値

私が持っているのは、変換して画面にグラフ表示する必要があるネットワークを介して私に送られる浮動小数点数です。数字は、5.2,285.159,294729172.258、-10734.112などの範囲で指定できます。私がしたいのは、最も重要な数字の1桁を丸めて使用することです。

例:私を手助けするために使用することができ

5.2 = 5 
285.159 = 300 
294729172.258 = 300000000 
-10734.112 = -11000 

何かアドバイスをいただければ幸いです。

+1

および294729172.258〜300000000?丸め基準を定義し、丸め機能を実行する必要があります。 – fbernardo

+0

私は5.2 = 5だと思うだろうが、5.5 = 6のようなものだと思うだろう – Seb

答えて

3

はここに私のソリューションです:

int roundMostSignificant(float input) 
{ 
    NSNumber *number = [NSNumber numberWithFloat:input]; 
    static NSNumberFormatter *formatter = nil; 

    if (!formatter) 
    { 
     formatter = [NSNumberFormatter new]; 
     [formatter setMinimumSignificantDigits:1]; 
     [formatter setMaximumSignificantDigits:1]; 
     [formatter setUsesSignificantDigits:YES]; 
    } 

    return [[formatter numberFromString:[formatter stringFromNumber:number]] intValue]; 
} 

はい、これは、オブジェクトを使用していますが、私はそれがあなたのためなど、解析し、丸め処理し、これは、長期的にはあなたの最善の策になると思います。

+0

あなたはこれのために神様です。どうもありがとうございます!可能であれば、これがバックグラウンドで何をしているのかを説明したり、このプロセスを説明するドキュメントを教えてください。私はできるだけ多くのことを学びたいと思っています。 – Seb

+0

+1。そして@Sebでは '-10734.112'に' -10000'が与えられます。これはあなたが挙げた結果より論理的です: '-11000'。 – sch

+0

@Sebこれは最初のことですが、浮動小数点数を入力として受け取ります。次に、浮動小数点数を1桁の有効数字に丸めた文字列に変換し、その文字列から数値を再作成し、その数値を返します。 –

1

ちょうどそれを行うNSDecimalNumberNSDecimalNumberHandlerクラスがあります。数値の丸めを行う精度と方向を定義することができます。

簡単な例は次のようになります。これはおそらく、あなたの最大の数のために働くだろう

NSDecimalNumber *dn = [NSDecimalNumber decimalNumberWithMatnissa:294729172258 exponent:-3 isNegative:NO]; 
NSDecimalNumberHandler *dnh = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:-6 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; 

NSDecimalNumber *rounded = [dn decimalNumberByRoundingAccordingToBehavior:dnh];