フロートに小数点以下2桁のみを表示させる


296

私はの値を持っています25.00が、floatそれを画面に印刷するとそうなります25.0000000
小数点以下2桁のみで値を表示するにはどうすればよいですか?


var nf = NSNumberFormatter()nf.positiveFormat = "0。##" var numberAfterRound = nf.stringFromNumber(NSNumber(double:number))!
kalpeshdeo 2015

回答:


648

数値の保存方法の問題ではなく、表示方法の問題です。これを文字列に変換するときは、希望する精度(小数点以下2桁)に丸める必要があります。

例えば:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];

%.02ffloat(%f)をフォーマットすることを2桁に丸め、0sを埋め込む必要があることをフォーマッターに伝えます。

例えば:

%f = 25.000000
%.f = 25
%.02f = 25.00

7
%.2fを使用すると、実際には25ではなく25.00が返されることに気付きました。これは奇妙です。
fulvio 2011年

3
私がいつも理解していた方法は、小数点以下の数字が、あなたが得た小数点以下の桁数を示していることでした。したがって、.2fは実際に25.00を与え、.4fは25.0000を与えます。
エリックS

3
誰でも好奇心旺盛である場合として1がどのように 実際に取得 25 .. @"%.f"トリックを行います。上記に書かれていることはありません
Alex Grey

4
@acecapades、使用する場合@"%.*f", decimalPlaces, number
Jonathan。

12
おそらくこれは、部分的なオフトピックになりますが、私は別の形式を追加します。%03.f = 025
SoftDesigner

197

ここにいくつかの修正があります

//for 3145.559706

スウィフト3

let num: CGFloat = 3145.559706
print(String(format: "%f", num)) = 3145.559706
print(String(format: "%.f", num)) = 3145
print(String(format: "%.1f", num)) = 3145.6
print(String(format: "%.2f", num)) = 3145.56
print(String(format: "%.02f", num)) = 3145.56 // which is equal to @"%.2f"
print(String(format: "%.3f", num)) = 3145.560
print(String(format: "%.03f", num)) = 3145.560 // which is equal to @"%.3f"

Obj-C

@"%f"    = 3145.559706
@"%.f"   = 3146
@"%.1f"  = 3145.6
@"%.2f"  = 3145.56
@"%.02f" = 3145.56 // which is equal to @"%.2f"
@"%.3f"  = 3145.560
@"%.03f" = 3145.560 // which is equal to @"%.3f"

等々...


最後のものは正確ですか?@ "%。03f" = 3145.566?どのようにして.560ではなく.566を取得しましたか?
pixelfreak

小数点以下の桁数を決定する整数を変数にできますか?@ "%。xf"のようにxは任意の整数にできますか?
acecapades 2012

@ "%。f"に問題がある場合は、@ "%。0f"を試してください。私はこれが他の1
つがし

1
%.2fの代わりに%.02fを使用する理由を誰かに教えてもらえますか?
hinterbu

20

NSNumberFormatterを使用して試すこともできます。

NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];

ネガティブフォーマットも設定する必要があるかもしれませんが、それを理解するのに十分賢いと思います。


このフロートが必要ですnumTwoDecimalDigits = atof([s UTF8String]);
loretoparisi 2013年

10

上記の回答に基づいて迅速な拡張を行いました

extension Float {
    func round(decimalPlace:Int)->Float{
        let format = NSString(format: "%%.%if", decimalPlace)
        let string = NSString(format: format, self)
        return Float(atof(string.UTF8String))
    }
}

使用法:

let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true

このソリューションはCGFloatでも機能するようです。驚くばかり!
eonist

これは私が探していたものです。どうも!
Tushar Katyal

9

Swift言語では、表示したい場合は、この方法で使用する必要があります。たとえば、UITextViewでdouble値を割り当てるには、次のようにします。

let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)

Objective-cがNSLog()を使用するようにLOGで表示したい場合は、Swift言語で次のように実行できます。

println(NSString(format:"%.2f", result))

3

Objective-cでは、(NSStringへのポインタの代わりに)通常のchar配列を処理している場合は、次のように使用することもできます。

printf("%.02f", your_float_var);

OTOH、必要なのがその値をchar配列に格納する場合は、次のように使用できます。

sprintf(your_char_ptr, "%.02f", your_float_var);

3

すべての答えの問題は、除算を使用したため、乗算してから除算すると精度の問題が発生することです。私はこれをPDP8のプログラミングからずっと前に学びました。これを解決する方法は次のとおりです。

return roundf(number * 100) * .01;

したがって、15.6578は15.6578999やそのような意図しないものではなく、15.66だけを返します。

どの程度の精度が必要かはあなた次第です。製品を除算せずに、10進数で乗算します。面白い文字列変換は必要ありません。


1

目的-cは、浮動小数点値を2桁の10進数で表示したい場合、引数を渡して、表示したい小数点の数を指定します。例えば、0.02fは25.00を出力します0.002fは25.000を出力します


1

精度に応じて動的にフォーマットする方法は次のとおりです。

+ (NSNumber *)numberFromString:(NSString *)string
{
    if (string.length) {
        NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
        f.numberStyle = NSNumberFormatterDecimalStyle;
        return [f numberFromString:string];
    } else {
        return nil;
    }
}

+ (NSString *)stringByFormattingString:(NSString *)string toPrecision:(NSInteger)precision
{
    NSNumber *numberValue = [self numberFromString:string];

    if (numberValue) {
        NSString *formatString = [NSString stringWithFormat:@"%%.%ldf", (long)precision];
        return [NSString stringWithFormat:formatString, numberValue.floatValue];
    } else {
        /* return original string */
        return string;
    }
}

例えば

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];

=> 2.3453

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];

=> 2

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];

=> 2.35(切り上げ)


これは非常に優れたソリューションです。それがどのように機能するか私に説明できますか?余分な「%」記号を追加したようです。
ユージーンアレクセエフ2017年

1

Swiftの別のメソッド(NSStringを使用しない):

let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")

PSこのソリューションは、&でのみテストされたCGFloatタイプでは機能しませんFloatDouble


1
@Unknown downvoterこれは迅速な解決策です&迅速な他の回答とは異なるので、なぜですか?
Aks、2015年

floatを返すことができる場合は、いつでもCGFloatに変換できます
eonist

1

以下のように使用NSNumberFormattermaximumFractionDigitsます:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);

そして、あなたは得るでしょう 12.35


0

浮動小数点値も必要な場合:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.