Целочисленный эквивалент float
числа f
float f=123.456;
может быть выполнен с использованием modff()
как
float integral, fractional;
char str[50], temp[20];
fractional = modff(f, &integral);
Сейчас integral
имеет целочисленную часть (например, 123.000000), а fractional
имеет дробную часть (например, 0.456000).
Если число с плавающей запятой (в данном случае f
) было отрицательным, оба значения integral
и fractional
будет отрицательным.
Вы можете сделать
if(fractional<0)
{
fractional = -fractional;
}
, чтобы исправить это.
Сейчас,
sprintf(temp, "%g", fractional);
Формат %g
спецификатор удалит завершающие нули, и temp
теперь будет иметь "0.456"
.
sprintf(str, "%g%s", integral, temp[1]=='.'?temp+2:"");
. temp[1]=='.'?
сделано, потому что если бы дробная часть была 0
, не было бы десятичной точкипри печати fractional
, как это было бы 0
, а не 0.000000
.Если второй символ в temp
не равен .
, fractional
равен нулю, и нам не нужно беспокоиться об этом.
Теперь в нашем случае str
будет "123456"
.Но это в форме строки.Нам нужно преобразовать его в целое число.Для этого используйте strtol()
.
long l=strtol(str, NULL, 10);
if(l>INT_MAX || errno==ERANGE)
{
printf("\noverflow");
}
else
{
printf("\n%d", strtol(str, NULL, 10));
}
Вы можете проверить возвращаемое значение strtol()
и errno
(из errno.h
. Проверьте, является ли оно ERANGE
), чтобы увидеть, переполнено лиПроизошло.
Чтобы увидеть, может ли результирующее значение быть сохранено в int
, сначала сохраните значение, возвращенное strtol()
в long int
, и посмотрите, больше ли оно INT_MAX
(оно вlimits.h
).
Следует отметить, что точность результата будет зависеть от точности, с которой число с плавающей запятой представлено в двоичном виде.