부동 소수점은 소수점 이하 두 자리 만 표시합니다


296

에 값 25.00float있지만 화면에 인쇄 하면 값 이 25.0000000입니다.
소수점 이하 두 자리로만 값을 표시하려면 어떻게해야합니까?


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

답변:


648

숫자가 저장되는 방식이 아니라 표시하는 방식이 중요합니다. 문자열로 변환 할 때 원하는 정밀도로 반올림해야합니다.이 경우 소수점 이하 두 자리입니다.

예 :

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

%.02f플로터에 float ( %f)의 서식을 지정하고 두 자리로 반올림하고 0s 로 채워야 함을 알려줍니다 .

예 :

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

7
% .2f를 사용하면 실제로 25가 아닌 25.00을 반환한다는 것을 알았습니다. 이것은 이상합니다.
fulvio

3
내가 항상 이해했던 방법은 소수점 이후의 숫자가 얼마나 많은 소수점을 가지고 있는지를 말한 것입니다. 따라서 .2f는 실제로 25.00을 제공하고 .4f는 25.0000을 제공합니다.
Erik S

3
누군가가 실제로 어떻게 얻는 궁금하다면 25.. @"%.f"트릭을 수행하십시오. 위에 쓰여진 내용은 그렇지 않습니다 .
Alex Gray

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"

오브제 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

@ "%. f"에 문제가 있으면 @ "%. 0f"를 시도하십시오. 나는 이것이 다른 곳이없는 소수 자리를 얻지 못한다는 것을 알았다
simon_smiley

1
아무도 왜 % .2f 대신 % .02f를 사용하는지 말해 줄 수 있습니까?
hinterbu

20

NSNumberFormatter를 사용해 볼 수도 있습니다.

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

음수 형식을 설정해야 할 수도 있지만 알아낼 정도로 똑똑하다고 생각합니다.


이 float가 필요합니다. numTwoDecimalDigits = atof ([s UTF8String]);
loretoparisi

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 Language에서 표시하려면이 방법으로 사용해야합니다. 예를 들어 UITextView에 double 값을 할당하려면

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

objective-c가 NSLog ()를 사용하는 것처럼 LOG에 표시하려면 Swift Language에서 다음과 같이 할 수 있습니다.

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 만 반환합니다.

원하는 정밀도 수준은 귀하에게 달려 있습니다. 제품을 나누지 말고 십진수로 곱하십시오. 재미있는 문자열 변환이 필요하지 않습니다.


1

객관적으로 -c는 u를 소수점 2 자리로 표시하고 싶을 때 얼마나 많은 소수점을 표시 할 것인지를 나타내는 인수를 전달합니다. 예 : 0.02f는 인쇄합니다 20.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 (반올림)


아주 좋은 해결책입니다. 큰 감사합니다. 작동 원리를 설명해 주시겠습니까? 추가 '%'기호를 추가 한 것을 확인했습니다.
Eugene Alexeev

1

NSString을 사용하지 않고 Swift를 위한 다른 방법 :

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

추신 :이 솔루션은 &로 테스트 한 CGFloat 유형 에서는 작동하지 않습니다.FloatDouble


1
@Unknown downvoter 이것은 신속한 해결책이며 다른 해결책과는 다른 이유는 무엇입니까?
Aks

플로트를 반환 할 수 있다면 항상 CGFloat로 변환 할 수 있습니다
eonist

1

사용 NSNumberFormatter하여 maximumFractionDigits아래와 같이 :

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]);

0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.