답변:
숫자가 저장되는 방식이 아니라 표시하는 방식이 중요합니다. 문자열로 변환 할 때 원하는 정밀도로 반올림해야합니다.이 경우 소수점 이하 두 자리입니다.
예 :
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
플로터에 float ( %f
)의 서식을 지정하고 두 자리로 반올림하고 0
s 로 채워야 함을 알려줍니다 .
예 :
%f = 25.000000
%.f = 25
%.02f = 25.00
25
.. @"%.f"
트릭을 수행하십시오. 위에 쓰여진 내용은 그렇지 않습니다 .
@"%.*f", decimalPlaces, number
%03.f = 025
몇 가지 수정 사항이 있습니다.
//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
objective-c에서 NSString에 대한 포인터 대신 일반 char 배열을 처리하는 경우 다음을 사용할 수도 있습니다.
printf("%.02f", your_float_var);
OTOH, 원하는 값을 char 배열에 저장하려면 다음을 사용할 수 있습니다.
sprintf(your_char_ptr, "%.02f", your_float_var);
정밀도에 따라 동적으로 서식을 지정하는 방법은 다음과 같습니다.
+ (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 유형 에서는 작동하지 않습니다.Float
Double
값을 플로팅 해야하는 경우 :
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);