Java Integer-Double Division verwarring

Programma 1

int sum = 30;  
double avg = sum / 4; // result is 7.0, not 7.5 !!!

vs.

Programma 2

int sum= 30   
double avg =sum/4.0 // Prints lns 7.5

Is dit omdat het ‘4’ in het programma 1 optreedt als een letterlijk geheel getal? SO 30/4 zou me geven 7. Sinds dit gegevenstype een dubbele is, moeten we a .0 toevoegen aan het einde. dus ‘7.0’

Programma 2 heeft 4,0 die fungeert als letterlijk dubbel. Een int / double zou altijd dubbel geven omdat het nauwkeuriger is. Dus we krijgen ‘7.5’. Ik begrijp niet welk dubbele gegevenstype het resultaat is .. Het hoeft echt niets te doen sinds de voorwaarden van het dubbele gegevenstype al is voldaan (hebben het meest precieze resultaat uit de berekening).

Heb ik het mis? Ik moedig je aan om me te corrigeren! Dit is hoe ik leer .. 🙂


Antwoord 1, Autoriteit 100%

In uw eerste voorbeeld:

int sum = 30;  
double avg = sum / 4; // result is 7.0, not 7.5 !!!

sumis een int en 4is ook een int. Java scheidt een geheel getal door een ander en krijgt een integer-resultaat. Dit gebeurt allemaal vóór Het wijst de waarde toe aan double avg, en tegen die tijd heeft u al alle informatie aan de rechterkant van het decimale punt verloren.

Probeer wat gieten.

int sum = 30;
double avg = (double) sum / 4; // result is 7.5

of

int sum = 30;
double avg = sum / 4.0d; // result is 7.5

Antwoord 2, Autoriteit 71%

Dit is een deling van gehele getallen (omdat daarbij twee integers)

int sum = 30;  
double avg = (sum / 4); // result is 7

integerdeling, zal naar beneden afgerond op het eerstvolgende gehele getal.

Dit is echter een dubbel afdeling (4,0 omdat een double)

int sum= 30   
double avg = (sum/4.0) //  result is 7.5

Dit is het verwachte gedrag en de conversie zijn allemaal goed gedefinieerd. U hoeft niet te raden. Neem een ​​kijkje op de java docs over conversie .

Een verbreding omzetting van een int of langere waarde te drijven, of een lange
waarde te verdubbelen, kan leiden tot verlies van nauwkeurigheid – die het resultaat
sommige van de minst significante bits van de waarde verliest. In deze
geval zal de resulterende drijvende kommawaarde een goed afgeronde worden
versie van de gehele waarde, via IEEE 754 door naar de dichtstbijzijnde stand


Antwoord 3, Autoriteit 50%

In java, operaties met betrekking tot alleen integer typen (int, lang en ga zo maar door) hebben integer resultaten . Dit geldt ook voor afdelingen.

Zowel de 30 en 4 gehele getallen zijn, dus als je probeert om ze te verdelen, integer divisie wordt gebruikt.

Maar als je probeert uit 30.0/4of 30/4.0dan zal het resultaat zijn 7.5omdat u zal worden met behulp van floating-point divisie.

De gedeclareerde type van de variabele avgheeft geen invloed op het resultaat. Het decimale gedeelte verloren gaat tijdens de divisie, en niet wanneer u de waarde toe te wijzen aan de variabele.


Antwoord 4

Beeld genomen van: http: // www.mathcs.emory.edu/~cheuneunst/courses/170/syllabus/04/mixed.html

Verwijs hierboven URL voor meer duidelijke uitleg.


Antwoord 5

Programma 1
In Java, wanneer u een divisie tussen twee gehele getallen doet, is het resultaat een geheel getal. Dus wanneer u som / 4 doet, is het resultaat het geheel getal 7. Dan wijst u dat geheel getal toe aan een dubbele variabele, zodat 7 in 7,0 wordt.

Programma 2
In Java, wanneer u een divisie uitvoert tussen een geheel getal en een dubbel, is het resultaat een dubbele. Dus wanneer u som / 4.0 doet, is het resultaat het resultaat de dubbele 7,5. Dan wijst u dat toe aan een dubbele variabele, dus het is nog steeds 7,5.

Dus het probleem is niet hoe Printenln de variabelen afdrukt, maar hoe divisie werkt in Java

Other episodes