C converteer drijvende komma naar int

Ik gebruik C(niet C++).

Ik moet een float-getal converteren naar een int. Ik wil niet afronden op het dichtstbijzijnde getal, ik wil gewoon elimineren wat na het gehele deel staat. Iets als

4.9 -> 4.9-> 4

Antwoord 1, autoriteit 100%

my_var = (int)my_var;

Zo simpel is dat.
In principe heb je het niet nodig als de variabele int is.


Antwoord 2, autoriteit 20%

Gebruik in C

int C = var_in_float;

Ze zullen impliciet converteren


Antwoord 3, autoriteit 16%

Als je het naar beneden wilt afronden, werp je het gewoon.

float my_float = 42.8f;
int my_int;
my_int = (int)my_float;          // => my_int=42

Voor andere doeleinden, als u het naar het dichtst wilt afronden, kunt u een kleine functie of een definitie als volgt maken:

#define FLOAT_TO_INT(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
float my_float = 42.8f;
int my_int;
my_int = FLOAT_TO_INT(my_float); // => my_int=43

Wees voorzichtig, idealiter moet je controleren of de float tussen INT_MIN en INT_MAX ligt voordat je hem cast.


Antwoord 4, autoriteit 5%

double a = 100.3;
printf("%f %d\n", a, (int)(a* 10.0));
Output Cygwin 100.3 1003
Output MinGW: 100.3 1002

Het gebruik van (int) om double naar int te converteren lijkt niet faalveilig te zijn

Je kunt hier meer over vinden: Dubbel converteren naar int?


Antwoord 5

Goede gast! — waar ik nog geen bevredigend antwoord voor mijn geval heb gevonden,
het antwoord dat ik hier geef werkt voor mij, maar is mogelijk niet toekomstbestendig…

Als men gcc (clang?) gebruikt en -Werroren –Wbad-function-castgedefinieerd heeft,

int val = (int)pow(10,9);

zal resulteren:

error: cast from function call of type 'double' to non-matching type 'int' [-Werror=bad-function-cast]

(om een goede reden, overloop en waar waarden worden afgerond, moet worden doordacht)

EDIT: 2020-08-30: Dus, mijn use-case cast de waarde van de functie die dubbel terugkeert naar int, en koos pow() om dat op zijn plaats weer te geven
van een privéfunctie ergens. Toen omzeilde ik het denken pow() meer.
(Zie opmerkingen waarom pow() hieronder gebruikt kan worden problematisch…).

Na goed doordacht (dat de parameters voor pow() goed zijn), lijkt int val = pow(10,9);te werken met gcc 9.2 x86-64 …

maar let op:

printf("%d\n", pow(10,4));

kan bijv. uitvoeren

-1121380856

(voor mij) waar

int i = pow(10,4); printf("%d\n", i);

gedrukt

10000

in een bepaald geval heb ik het geprobeerd.

Other episodes