programing

소수점 두 자리만 표시되도록 플로트 만들기

goodsources 2023. 4. 11. 21:58
반응형

소수점 두 자리만 표시되도록 플로트 만들기

나는 가치관을 가지고 있다25.00에 있어서float화면에 출력하면25.0000000.
소수점 두 자리만 사용하여 값을 표시하는 방법은 무엇입니까?

이것은 숫자가 어떻게 저장되느냐의 문제가 아니라 어떻게 표시하느냐의 문제입니다.문자열로 변환할 때는 원하는 정밀도로 반올림해야 합니다.이 경우 소수점 이하 두 자리입니다.

예:

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

%.02f플로트를 포맷하는 것을 포메터에 알립니다( ).%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"

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"

기타 등등...

NS Number를 사용해 볼 수도 있습니다.포메터:

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에서 이중 값을 할당하려면 다음과 같이 하십시오.

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

NSLog()를 사용하여 objective-c와 같이 LOG에 표시하는 경우 Swift Language에서는 다음과 같이 할 수 있습니다.

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

objective-c에서는 (NSString 포인터가 아닌) 일반 문자 배열을 취급하는 경우에도 다음을 사용할 수 있습니다.

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

OTOH, 이 값을 char 배열에 저장하는 경우 다음과 같이 사용할 수 있습니다.

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

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

return roundf(number * 100) * .01;

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

어느 정도의 정밀도를 원하는지는 당신에게 달려 있습니다.곱을 나누지 말고 소수점 당량을 곱하면 됩니다.재미있는 문자열 변환은 필요하지 않습니다.

목표에서 -c는 부동값을 10진수 2로 표시하고, 표시할 소수점 수를 나타내는 pass 인수를 지정합니다.예를 들어 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 (올림)

Swift의 다른 방법(NSString을 사용하지 않음):

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

추신: 이 솔루션은 테스트된 CGFloat 유형에서만 작동하지 않습니다.Float&Double

NSNumberFormattermaximumFractionDigits음음음같 뭇매하다

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

반응형