2017-01-19 7 views
-4

У меня есть несколько номеров с плавающей точкой для печати:C - поворот 3.00 в 3

{3.00, 3.20, 2.23, 5.00, 3.40 } 

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

Как можно преобразовать 3.00 в 3 и 5.00 в 5? это преобразование не печатается

+2

Вставить в 'int'. '(int) 3.00' –

+0

@Eli Sadoff Я печатаю числа в рекурсии. Числа, которые не являются 0 после десятичного знака, должны быть напечатаны так, как они есть, но только те, у которых есть .00, должны быть напечатаны как целое число. Я не знаю, у каких номеров есть .00, поэтому я могу передать их в int. – busuu

+0

@EliSadoff casting to '(int) x' является UB, если' x' имеет значение FP, намного превышающее интервал int. – chux

ответ

2

Нельзя использовать (т. Е. Используя только спецификатор формата) печатать либо два десятичных знака, либо ноль для числа, заканчивающегося, например. 3.20.

Вам необходимо проверить, заканчивается ли номер .00; например:

if((int)round(num * 100) % 100 == 0) // if decimals are `.00` 
    printf("%.0f", num); 
else // not `.00` 
    printf("%.2f", num); 

Если 3.2 хорошо для 3.20, то %g спецификатор также может быть полезен.

+0

Здесь нет необходимости в 'int' математике, которая является UB для больших значений' num'. Лучше использовать 'fmod()' или даже 'modf()', чем '%'. – chux

0

Просто назначьте их массиву int или просто введите их в int для вашей цели.

int i = 3.00; //lhs is int and rhs is double i will store 3 only 
(int)3.00 //cast 

печать их с %.f будет также работать

+0

Ваш спецификатор формата прав, но они не могут манипулировать данными –

+0

здесь нет округления десятичной части, будет усечено @George –

0

литья до целого типа будет усекать положительные целые числа вплоть до целой части:

float f = 2.00; 
printf("f: [%f], [%d]", f, (int) f); 

п: [2,000000], [2]

Если вы хотите оставить 2.50 как 2.5, тогда ch требуется эквалайзер для .00:

if((int) round(num * 100) % 100 == 0) // if decimals are .00 
    printf("%.0f", num); // truncate all 
else // not .00 
    printf("%.2f", num); // truncate to 2 decimal places 
+0

есть разница между печатью и преобразованием. –

+0

Цель состоит в том, чтобы напечатать их, как усеченные и литые, чтобы достичь этого. – 4pie0

0

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

Прежде всего, нужно определить, если у вас есть цифры, которые 0. Вы можете сделать это, как этот

if (fabs(number - round(number)) < 0.01) 
    printf("%.2f", number); 
else 
    printf("%d", (int) number); 

Это просто означает, как намек в правильном направлении. Вы можете улучшить его немного по своему усмотрению.

Редактировать: Я предполагаю, что вы хотите две цифры для 3.20, а не только 3.2.

Смежные вопросы