Hoe converteer je double naar int in C?

Ik krijg 3668 in b, in plaats van 3669.

Hoe los ik dit probleem op?
En als ik 3559.8 zo heb, wil ik ook 3559 en niet 3560.


Antwoord 1, autoriteit 100%

Ik vermoed dat je eigenlijkdat probleem niet hebt – ik vermoed dat je het volgende wel hebt:

double a = callSomeFunction();
// Examine a in the debugger or via logging, and decide it's 3669.0
// Now cast
int b = (int) a;
// Now a is 3668

Wat me dat doet zeggen, is dat hoewel het waar is dat veel decimale waarden nietexact kunnen worden opgeslagen in floatof double, dat niet zo is. t geldt voor gehele getallen van dit soort grootte. Ze kunnen heel gemakkelijk exact worden weergegeven in binaire drijvende-kommavorm. (Zeer grote gehele getallen kunnen niet altijd exact worden weergegeven, maar we hebben hier niet te maken met een heel groot geheel getal.)

Ik vermoed sterk dat uw doublewaarde eigenlijkiets minder is dan 3669.0, maar het wordt aan u weergegeven als 3669.0 door welk diagnostisch apparaat u ook gebruikt. De conversie naar een geheel getal voert alleen truncatie uit, geen afronding – vandaar het probleem.

Ervan uitgaande dat uw type doubleeen IEEE-754 64-bits type is, is de grootste waarde die kleiner is dan 3669.0 precies

3668.99999999999954525264911353588104248046875

Dus als je een diagnostische benadering gebruikt waarbij die waarde wordt weergegeven als 3669,0, dan is het heel goed mogelijk (waarschijnlijk, zou ik zeggen) dat dit is wat er gebeurt.


Antwoord 2, autoriteit 7%

main() {
    double a;
    a=3669.0;
    int b;
    b=a;
    printf("b is %d",b);
}

uitvoer is:b is 3669

wanneer je b=a schrijft; dan wordt het automatisch omgezet in int

see on-line compiler result : 

http://ideone.com/60T5b


Dit heet Impliciete typeconversie
Lees hier meer https://www.geeksforgeeks.org/ impliciete-type-conversie-in-c-met-voorbeelden/


Antwoord 3, autoriteit 3%

Dit is het beruchte probleem met de afronding van drijvende komma’s. Voeg gewoon een heel klein getal toe om het probleem op te lossen.

double a;
a=3669.0;
int b;
b=a+ 1e-9;

Antwoord 4

int b;
double a;
a=3669.0;
b=a;
printf("b=%d",b);

deze code geeft de uitvoer als b=3669 alleen jij controleert het duidelijk.

Other episodes