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 float
of 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 double
waarde 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 double
een 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 :
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.