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


296

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


var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (double: number))!
kalpeshdeo

Ответы:


648

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

Например:

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

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

Например:

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

7
Я заметил, что использование% .2f на самом деле возвращает 25,00 в вашем примере, а не 25. Это странно.
фульвио

3
Я всегда понимал, что число после десятичной запятой говорит о том, сколько десятичных знаков вы получили. Таким образом, .2f действительно даст 25,00, а .4f даст 25,0000.
Эрик С

3
Если кому-то любопытно, как он на самом деле получает 25 ... @"%.f"делает свое дело. То, что написано выше, не делает .
Алекс Грей

4
@acecapades, если вы используете@"%.*f", decimalPlaces, number
Джонатан.

12
Возможно, это будет частично не по теме, но я бы добавил другой формат:%03.f = 025
SoftDesigner,

197

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

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

и так далее...


Последний точен? @ "%. 03f" = 3145,566? Как вы получили .566 вместо .560?
pixelfreak

может ли целое число, определяющее количество десятичных знаков, быть переменной? как @ "%. xf", где х может быть любым целым числом?
acecapades

Если у вас возникли проблемы с @ "%. F", попробуйте @ "%. 0f". Я обнаружил, что это работает, чтобы получить десятичные
разряды,

1
Может кто-нибудь сказать мне, почему вы используете% .02f вместо просто% .2f?
Хинтербу

20

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

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

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


вам нужен этот float numTwoDecimalDigits = atof ([s UTF8String]);
Лоретопариси

10

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

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

Это решение также, похоже, работает с CGFloat. Потрясающие!
эонист

Это то, что я искал. Спасибо друг!
Тушар Катьял

9

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

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

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

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

3

В target-c, если вы имеете дело с обычными массивами символов (вместо указателей на NSString), вы также можете использовать:

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

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

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

3

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

return roundf(number * 100) * .01;

Таким образом, 15,6578 возвращает только 15,66, а не 15,6578999 или что-то непредвиденное.

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


1

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


1

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

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


Это очень хорошее решение, большое спасибо. Можете ли вы объяснить мне, как это работает? Я вижу, вы добавили дополнительный символ "%".
Евгений Алексеев

1

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

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

PS это решение не работает с типом CGFloat, протестированным только с Float&Double


1
@ Неизвестный downvoter, это рабочее решение для swift и также отличается от других ответов для swift, так почему?
Акс

если вы можете вернуть float, вы всегда можете преобразовать его в CGFloat
eonist

1

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

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

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


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.