Bruk av kaster på resultatene av heltall og flytende divisjon: hva skjer her?

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 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?

5
задан Michael Petrotta 4 August 2011 в 23:50
поделиться