Используйте printf для форматирования поплавков без десятичных знаков, если только завершение 0s

Можно ли форматировать float на C, чтобы отображать только до двух знаков после запятой, если они отличаются от 0s с помощью printf?

Пример:

12 => 12

12.1 => 12.1

12.12 => 12.12

Я пробовал использовать:

float f = 12; printf("%.2f", f) 

но я получаю

12 => 12.00

12,1 => 12,10

12.12 => 12.12

Вы можете использовать спецификатор формата %g :

 #include  int main() { float f1 = 12; float f2 = 12.1; float f3 = 12.12; float f4 = 12.1234; printf("%g\n", f1); printf("%g\n", f2); printf("%g\n", f3); printf("%g\n", f4); return 0; } 

Результат:

 12
 12,1
 12,12
 12,1234

Обратите внимание, что, в отличие от спецификатора формата f , если вы укажете число перед g оно относится к длине целого числа (а не к числу десятичных знаков, как к f ).

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

 #include  #include  #include  int main() { float f1 = 12.13; float f2 = 12.245; float f3 = 1242.145; float f4 = 1214.1; int i = 0; char *s1 = (char *)(malloc(sizeof(char) * 20)); char *s2 = (char *)(malloc(sizeof(char) * 20)); sprintf(s1, "%f", f1); s2 = strchr(s1, '.'); i = s2 - s1; printf("%.*g\n", (i+2), f1); sprintf(s1, "%f", f2); s2 = strchr(s1, '.'); i = s2 - s1; printf("%.*g\n", (i+2), f2); sprintf(s1, "%f", f3); s2 = strchr(s1, '.'); i = s2 - s1; printf("%.*g\n", (i+2), f3); sprintf(s1, "%f", f4); s2 = strchr(s1, '.'); i = s2 - s1; printf("%.*g\n", (i+2), f4); free(s1); free(s2); return 0; } 

И вот результат

 12.13 12.24 1242.15 1214.1 

Для чего это стоит, вот простая реализация ObjC:

 // Usage for Output 1 — 1.23 [NSString stringWithFormat:@"%@ — %@", [self stringWithFloat:1], [self stringWithFloat:1.234]; // Checks if it's an int and if not displays 2 decimals. + (NSString*)stringWithFloat:(CGFloat)_float { NSString *format = (NSInteger)_float == _float ? @"%.0f" : @"%.2f"; return [NSString stringWithFormat:format, _float]; } 

% g не делал этого для меня – это один да 🙂 Надеюсь, это полезно для некоторых из вас.