web-dev-qa-db-ja.com

Objective-Cの端数処理

Objective-Cプログラムでの出力を強化するために、数値の丸めと文字列への変換を試みています。

最も近い.5に丸め、ラベルのテキストを設定するために使用する浮動小数点値があります。

例えば:

1.4は次の文字列になります:1.5

1.2は次の文字列になります:1

0.2は次の文字列になります:0

私はしばらくの間Googleで答えを探していましたが、Objective-Cの初心者なので、何を検索すればいいのかわかりません。だから、私は本当に正しい方向にポインターを感謝します!

ありがとう、アッシュ

74
Ash

みなさんのポインターのおかげで、私はなんとか解決策を思いつきました。

float roundedValue = round(2.0f * number) / 2.0f;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:1];
[formatter setRoundingMode: NSNumberFormatterRoundDown];

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:roundedValue]];
[formatter release];

上記は、私が投げたテストケースで機能しますが、これを行うためのより良い方法を誰かが知っているなら、それを聞いてみたいと思います!

99
Ash
float floatVal = 1.23456;

丸め

int roundedVal = lroundf(floatVal); 

NSLog(@"%d",roundedVal);

切り上げ

int roundedUpVal = ceil(floatVal); 

NSLog(@"%d",roundedUpVal);

切り捨て

int roundedDownVal = floor(floatVal);

NSLog(@"%d",roundedDownVal);
37
Durai Amuthan.H
NSString *numberString = [NSString stringWithFormat:@"%f", round(2.0f * number) / 2.0f];
32
keremk

Lroundf()を使用して、floatを整数に丸めてから、整数を文字列に変換します。

24
Osos
NSString *numberString = [NSString stringWithFormat:@"%d",lroundf(number)];
11
Simpu

NSNumberFormatter の使用を検討することをお勧めします。

8
hbw

簡単な方法:

float theFloat = 1.23456;
int rounded = roundf(theFloat); NSLog(@"%d",rounded);
int roundedUp = ceil(theFloat); NSLog(@"%d",roundedUp);
int roundedDown = floor(theFloat); NSLog(@"%d",roundedDown);
// Note: int can be replaced by float
5
Lal Krishna

次のテクニックは、金融アプリケーションで私のために働いた。

 NSString *dd=[NSString stringWithFormat:@"%0.2f",monthlyPaymentCalculated];

        monthlyPaymentCalculated=[dd doubleValue];

self.monthlyPaymentCritical=monthlyPaymentCalculated;

最初に%0.2fで丸めてNSStringに保存し、次にそれを再びdoubleに変換しました。結果は計算に適していました。

2
NSString *intNumberString = [NSString stringWithFormat:@"%d", (int)floatNumber];

これらの関数を使用すると、任意の値に丸めることができます。p= 2を使用すると、偶数が得られます。

float RoundTo(float x, float p)
{
  float y = 1/p;
  return int((x+(1/(y+y)))*y)/y;
}

float RoundUp(float x, float p)
{
  float y = 1/p;
  return int((x+(1/y))*y)/y;
}

float RoundDown(float x, float p)
{
  float y = 1/p;
  return int(x*y)/y;
}
1
JJussi

特定の桁に丸める必要がありました(必ずしも整数に丸める必要はありません)。 NSNumberカテゴリーを作成し( Ashの答え に基づいて)、次のメソッドを追加しました:

- (NSString *)stringByRounding:(NSNumberFormatterRoundingMode)roundingMode
      toPositionRightOfDecimal:(NSUInteger)position
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setMaximumFractionDigits:position];
    [formatter setRoundingMode:roundingMode];
    NSString *numberString = [formatter stringFromNumber:self];
    return numberString;
}

これにより、次のように使用できます。

[aNumber stringByRounding:NSNumberFormatterRoundUp toPositionRightOfDecimal:2];

0を2番目のパラメーターとして渡すことで、整数に丸めることができます。

[aNumber stringByRounding:NSNumberFormatterRoundPlain toPositionRightOfDecimal:0];
1
Stunner