Сделать поплавок показывать только два десятичных знака
У меня значение 25.00
в float
, но когда я печатаю его на экране, оно составляет 25.0000000
.
Как отобразить значение только с двумя знаками после запятой?
- Почему целочисленное деление на -1 (отрицательное) приводит к FPE?
- Сколько двойных чисел существует между 0.0 и 1.0?
- Формат Float до n знаков после запятой
- Как может примитивное значение float быть -0.0? Что это значит?
- Почему Java Double.compare (double, double) реализован так, как есть?
- Преобразование float в строку
- Формат плавающей точки для std :: ostream
- Эффективная реализация log2 (__ m256d) в AVX2
Дело не в том, как хранится число, а в том, как вы его показываете. Преобразуя его в строку, вы должны округлить до нужной точности, которая в вашем случае равна двум десятичным знакам.
Например:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
сообщает форматируемому, что вы будете форматировать float ( %f
) и, который должен быть округлен до двух мест, и должен быть дополнен 0
с.
Например:
%f = 25.000000 %.f = 25 %.02f = 25.00
Вот несколько исправлений –
//for 3145.559706
Swift 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]];
Возможно, вам также понадобится установить отрицательный формат, но я думаю, что он достаточно умен, чтобы понять это.
В Swift Language, если вы хотите показать, вам нужно использовать его таким образом. Чтобы назначить двойное значение в UITextView, например:
let result = 23.954893 resultTextView.text = NSString(format:"%.2f", result)
Если вы хотите показать в LOG, как объектно-c, используя NSLog (), то в Swift Language вы можете сделать так:
println(NSString(format:"%.2f", result))
Я сделал быстрое расширение, основанное на вышеуказанных ответах
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
IN object-c, если вы имеете дело с регулярными массивами char (вместо указателей на NSString), вы также можете использовать:
printf("%.02f", your_float_var);
OTOH, если вы хотите сохранить это значение в массиве символов, вы можете использовать:
sprintf(your_char_ptr, "%.02f", your_float_var);
Проблема со всеми ответами заключается в том, что умножение, а затем деление результатов на точность вопросов, потому что вы использовали деление. Я давно это извлек из программирования на PDP8. Способ решения этого:
return roundf(number * 100) * .01;
Таким образом, 15.6578 возвращает только 15.66, а не 15.6578999 или что-то непреднамеренное.
Какой уровень точности вы хотите, зависит от вас. Просто не делите продукт, умножьте его на десятичный эквивалент. Не требуется смешное преобразование строк.
в объекте -c вы хотите отобразить значение float в 2 десятичных числах, затем передать аргумент, указывающий, сколько десятичных точек u хотите отобразить, например, 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, "%")
PS это решение не работает с типом CGFloat, проверенным только с помощью Float
& Double
Используйте NSNumberFormatter
с maximumFractionDigits
как 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]];