Сделать поплавок показывать только два десятичных знака

У меня есть значение 25.00 в float, но когда я печатаю его на экране, оно 25.0000000.
Как я могу отображать значение только с двумя десятичными знаками?

Ответ 1

Это не вопрос того, как хранится число, это вопрос того, как вы его показываете. При преобразовании его в строку вы должны округлить до нужной точности, которая в вашем случае равна двум десятичным знакам.

например:.

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

%.02f сообщает форматируемому, что вы будете форматировать float (%f) и, который должен быть округлен до двух мест, и должен быть дополнен 0 s.

например:.

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

Ответ 2

Вот несколько поправок -

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

и т.д.

Ответ 3

Вы также можете попробовать использовать NSNumberFormatter:

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

Возможно, вам также понадобится установить отрицательный формат, но я думаю, что он достаточно умен, чтобы понять это.

Ответ 4

В Swift Language, если вы хотите показать, что вам нужно использовать его таким образом. Чтобы назначить двойное значение в UITextView, например:

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

Если вы хотите показать в LOG, например, как objective-c использует NSLog(), то в Swift Language вы можете сделать это следующим образом:

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

Ответ 5

Я сделал быстрое расширение, основанное на приведенных выше ответах.

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

Ответ 6

IN objective-c, если вы имеете дело с регулярными массивами char (вместо указателей на NSString), вы также можете использовать:

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

OTOH, если вы хотите сохранить это значение в массиве char, вы можете использовать:

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

Ответ 7

в объекте -c есть u, чтобы отобразить значение float в 2 десятичных числах, затем передайте аргумент, указывающий, сколько десятичных точек u хотите отобразить например, 0.02f будет печатать 25.00   0.002f будет печатать 25.000

Ответ 8

Здесь некоторые методы для динамического форматирования в соответствии с точностью:

+ (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 (округление вверх)

Ответ 9

Другой метод для Swift (без использования NSString):

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

P.S. это решение не работает с типом CGFloat, проверенным только с помощью Float и Double

Ответ 10

Если вам нужно также плавать значение:

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

Ответ 11

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

Ответ 12

Используйте NSNumberFormatter с maximumFractionDigits, как показано ниже:

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

И вы получите 12.35

Ответ 13

Проблема со всеми ответами заключается в том, что умножение и деление результатов на точность, потому что вы использовали деление. Я давно это извлек из программирования на PDP8. Способ решения этого вопроса:

return roundf(number * 100) * .01;

Таким образом, 15.6578 возвращает только 15.66, а не 15.6578999 или что-то непреднамеренное.

Какой уровень точности вы хотите, зависит от вас. Просто не делите продукт, умножьте его на десятичный эквивалент. Не требуется смешное преобразование строк.