development

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

big-blog 2020. 3. 17. 23:39
반응형

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


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


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

예 :

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

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

예 :

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

다음은 몇 가지 수정 사항입니다.

//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"

등등...


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

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

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


위의 답변을 기반으로 신속한 확장을했습니다.

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

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

objective-c에서 NSString에 대한 포인터 대신 일반 char 배열을 처리하는 경우 다음을 사용할 수도 있습니다.

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

OTOH, 원하는 값을 char 배열에 저장하려면 다음을 사용할 수 있습니다.

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

모든 대답의 문제는 나누기를 사용했기 때문에 곱한 다음 나누면 정밀도 문제가 발생한다는 것입니다. 나는 오래 전에 PDP8에서 프로그래밍을 통해 배웠습니다. 이를 해결하는 방법은 다음과 같습니다.

return roundf(number * 100) * .01;

따라서 15.6578은 15.6578999 또는 의도하지 않은 것을 반환하지 않고 15.66 만 반환합니다.

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


객관적으로 -c는 u를 소수점 2 자리로 표시하고 싶을 때 얼마나 많은 소수점을 표시 할 것인지를 나타내는 인수를 전달합니다. 예 : 0.02f는 인쇄합니다 25.00 0.002f는 25.000을 인쇄합니다


정밀도에 따라 동적으로 서식을 지정하는 방법은 다음과 같습니다.

+ (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 (반올림)


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

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

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


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

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

그리고 당신은 얻을 것이다 12.35


값을 플로팅 해야하는 경우 :

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

 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];

참고 URL : https://stackoverflow.com/questions/560517/make-a-float-only-show-two-decimal-places

반응형