webForumDet fria alternativet

Varför blir aldrig y = 1.0?

Java

8 svar · 550 visningar · startad av hema80

Medlem sedan sep. 2004137 inlägg
Frågan#1

Varför blir detta ett program som inte fungerar som det ska utan bara går i en evighet?


class skrivaUtDouble
{	
	public static void main (String[] args)
	{
		double y;
		
		for (y=0.1; y!=1.0; y=y+0.1)
		{
			System.out.println(y);
		}
	}

} // ----- Slut class skrivaUtDouble -----

Om y är 0.1 och det hela tiden läggs på 0.1 så kommer man ju så småningom till 0.9? Eller? Enligt min miniräknare gör man det i alla fall.

Medlem sedan jan. 20021 122 inlägg
#2

Jo, men som du ser när du kör programmet blir det inte exakt 1.0, utan det blir lite avrundingsfel, och då blir inte värdet 1.0, och då fortsätter programmet. Istället för y!=1.0 bör du använda y <= 1.0.

Medlem sedan sep. 20011 086 inlägg
#3

pettsson skrev:

Istället för y!=1.0 bör du använda y <= 1.0.

Snarare y < 1.0.

Medlem sedan jan. 20021 122 inlägg
#4

Hm, just det, han ville ju att y inte skulle vara 1. :r

Medlem sedan maj 20033 218 inlägg
#5

pettsson skrev:

Jo, men som du ser när du kör programmet blir det inte exakt 1.0, utan det blir lite avrundingsfel, och då blir inte värdet 1.0, och då fortsätter programmet. Istället för y!=1.0 bör du använda y <= 1.0.

Nu tappade jag bort mig lite.
Varför blir det inte exakt 1.0?? hur kan det bli avrundingsfel, vilka värden avrundas??

Medlem sedan sep. 20011 086 inlägg
#6

Sjodahl skrev:

pettsson skrev:

Jo, men som du ser när du kör programmet blir det inte exakt 1.0, utan det blir lite avrundingsfel, och då blir inte värdet 1.0, och då fortsätter programmet. Istället för y!=1.0 bör du använda y <= 1.0.

Nu tappade jag bort mig lite.
Varför blir det inte exakt 1.0?? hur kan det bli avrundingsfel, vilka värden avrundas??

Flyttal kan inte representeras exakt i datorn, utan approximeras med ett tal som är nära. Därför lagras inte 1.0 som 1 utan som 1.0000000001 (eller nåt sånt, exakt hur det lagras kan skilja från dator till dator).

Medlem sedan maj 20033 218 inlägg
#7

så med andra ord kan man aldrig sätta ett exakt värde på en double variabel?

Medlem sedan sep. 20011 086 inlägg
#8

Sjodahl skrev:

så med andra ord kan man aldrig sätta ett exakt värde på en double variabel?

Nej.
Eller, du kan ju sätta

double i = 1.0

Det är dock inte säkert att i blir precis 1.0

Medlem sedan maj 20033 218 inlägg
#9

nej det jag menar, tycker det verkar skumt helt enkelt ;) då borde det finnas något sådant där vågtecken ungeförlika med istället för likamed ;)

249 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)