У меня есть значение 25.00
в float
, но когда я печатаю его на экране, оно есть 25.0000000
.
Как я могу отобразить значение только с двумя десятичными знаками?
У меня есть значение 25.00
в float
, но когда я печатаю его на экране, оно есть 25.0000000
.
Как я могу отобразить значение только с двумя десятичными знаками?
Ответы:
Дело не в том, как хранится число, а в том, как вы его отображаете. При преобразовании его в строку вы должны округлить до желаемой точности, которая в вашем случае составляет два десятичных знака.
Например:
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"
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"
и так далее...
Вы также можете попробовать использовать 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, например:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
Если вы хотите показывать в LOG так же, как target-c использует NSLog (), то в Swift Language вы можете сделать это так:
println(NSString(format:"%.2f", result))
В target-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 или что-то непредвиденное.
Какой уровень точности вы хотите, зависит от вас. Просто не делите продукт, умножьте его на десятичный эквивалент. Не требуется смешное преобразование строк.
Вот некоторые методы для динамического форматирования в соответствии с точностью:
+ (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, "%")
PS это решение не работает с типом CGFloat, протестированным только с Float
&Double
Используйте 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]];