Jeg er nybegynner, og det er noe som ikke gir mye mening for meg. Vær så snill å forklare hvor jeg går galt. Beklager hvis dette har blitt spurt før.
Her betyr tilstedeværelsen av desimaltegnet at disse blir evaluert ved hjelp av flytende punktdeling.
System.out.println(1/3.0); // this prints: 0.3333333333333333
System.out.println(1.0/3); // this prints: 0.3333333333333333
System.out.println(1.0/3.0); // this prints: 0.3333333333333333
Tilsynelatende er dette nedenfor et eksempel på "avkorting-heltallsdeling." Det virker litt rart for meg, men ok.
System.out.println(1/3); // this prints: 0
Er det greit å si: "I linjen nedenfor blir (dobbelt) rollebesetning evaluert 1. Det står effektivt:" behandle 1/3 som en dobbel - ikke bruk avkuttende heltallsdeling. bruk i stedet flytende punktdeling. ""
System.out.println((double)1/3); // this prints: 0.3333333333333333
Nedenfor får vi imidlertid 0,0 - hvordan skjedde det?
System.out.println((double)(1/3)); // this prints: 0.0
ok, så kanskje de ekstra parentesene betyr at (1/3) blir vurdert 1.. Den blir evaluert ved å trunkere heltallsdeling som gir 0. Og så blir dobbelt brukt og gir oss 0,0 Ok som gir mening
Ok, så vi kan kanskje foreslå et par generelle regler her:
Regel 1 : (dobbelt) uttrykk betyr å bruke (dobbelt) rollebesetning først og deretter evaluere uttrykket.
Regel 2: (dobbelt) (uttrykk) betyr evaluere uttrykket og deretter bruke rollebesetningen. Flott!
Så i neste linje nedenfor har vi: (int) uttrykk, så jeg antar at vi kan bruke regel 1). (Int) rollebesetningen blir vurdert 1.. Det står effektivt: "behandle 1.0 / 3 som en int - ikke bruk så mye minne som du ville gjort med en dobbel. Ikke bruk flytende punktdeling, bruk i stedet avkuttende heltallsdeling." "Så vi har 0 rett? Nei .
System.out.println((int)1/3.0); // this prints: 0.3333333333333333
Ok, så vi har 0.33333 slik at (int) rollebesetningen ikke blir vurdert 1. Det er som om den ikke var der. La oss foreslå en tredje regel:
Regel 3: (int) uttrykk betyr ignorere ( int) cast helt og hold bare evaluere uttrykket som om (int) ikke engang er der.
Ok å bruke regel 3 på linjen nedenfor, vi har (int) men vi skal bare ignorere det. 1.0 / 3.0 blir evaluert med flytende punktdeling og vi får 0.3333333. Suksess!
System.out.println((int)1.0/3.0); // this prints: 0.3333333333333333
Og i den siste linjen nedenfor har vi igjen (int), men vi kommer bare til å ignorere det. (1.0 / 3) blir evaluert ved hjelp av flytende punktdeling som gir 0.3333333333 riktig Nei.
System.out.println((int)(1.0/3)); // this prints: 0
Ok nå er jeg forvirret. Kan du hjelpe meg med å få hodet rundt dette?