Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Java's counteri automaatne muutmine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
aatomik
HV kasutaja
aatomik

liitunud: 30.11.2005




sõnum 14.09.2008 12:46:30 Java's counteri automaatne muutmine vasta tsitaadiga

Lihtsalt selgitades oleks vaja teha nii, et tsükli abil väljastatakse nubreid, mis muutuvad sammuga 0.1 + 0.2 + 0.1 + 0.2 jne. Proovisin mitut varianti, aga kas viga varajases pühapäeva hommikus vms, igal juhul tööle pole asja veel saanud. Mis oleks kõige lihtsam viis selle probleemi lahendamiseks?

Näitlik koodijupp, kus andmed väljastatakse sammuga 0.1:

java:
  1. public class example {
  2.         public static void main(String[] args) {
  3.                
  4.                 double x;
  5.                 double counter = 0.1;
  6.                
  7.                 for (x = 10; x > 0; x -= counter) {
  8.                         System.out.println("x väärtus on: " + x + "\ncounter väärtus on: " + counter);
  9.                 }
  10.  
  11.         }
  12.  
  13. }
Kommentaarid: 14 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 14
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 14.09.2008 13:08:48 vasta tsitaadiga

Kui probleem on põhimõtteline, siis tee sedasi kuigi süntaks ei pruugi javas nii käia. Pole javaga kokku puutunud.

public class example {
        public static void main(String[] args) {
               
                double x;
                double counter = 0.1;
               
                for (x = 10; x > 0; x -= counter) {
                        System.out.println("x väärtus on: " + x + "\ncounter väärtus on: " + counter);
                       if(counter<0.3){counter=counter+0.1;}
                       if(counter==0.3){counter=0.1;}
                }

        }

}

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
aatomik
HV kasutaja
aatomik

liitunud: 30.11.2005




sõnum 14.09.2008 13:23:04 vasta tsitaadiga

Sellisel juhul suureneb counter 0.1 --> 0.2 --> 0.3 ja siis jääbki 0.3 juurde. Vaja aga oleks 0.1 --> 0.2 --> 0.1 --> 0.2 meetodil muutuvat counterit. Ise hakkasin ka if ja else if abil asjaga mängima, aga veel pole lahenduseni jõudnud.
Kommentaarid: 14 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 14
tagasi üles
vaata kasutaja infot saada privaatsõnum
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 14.09.2008 13:54:41 vasta tsitaadiga

kui counter on 0.1, siis muudad 0.2'ks, muudel juhtudel 0.1'ks. nüüd tõlgi see javasse ja töötab
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 14.09.2008 13:58:25 vasta tsitaadiga

Või siis kasutusele võtta üks lisamuutuja (boolean) ja seda kontrollida.
Kui see on true siis lahutab 0.2 kui mitte siis 0.1. Ja seda muutujat muudad igal iteratsioonil.

Kolmas variant oleks integer counteri kasutamine ja kahega jagamise jääki (moodulit) kontrollida.

_________________
ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 14.09.2008 14:30:26 vasta tsitaadiga

andrusny kirjutas:
Kui probleem on põhimõtteline, siis tee sedasi kuigi süntaks ei pruugi javas nii käia. Pole javaga kokku puutunud.

public class example {
        public static void main(String[] args) {
               
                double x;
                double counter = 0.1;
               
                for (x = 10; x > 0; x -= counter) {
                        System.out.println("x väärtus on: " + x + "\ncounter väärtus on: " + counter);
                       if(counter<0.3){counter=counter+0.1;}
                       if(counter==0.3){counter=0.1;}
                }

        }

}

Selle näite viga on selles, et reaalarvud ei ole täpsed.

counteri väärtus ei pruugi olla täpselt 0.3 vaid näiteks 0.29999... või 0.3000...01
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 14.09.2008 14:44:43 vasta tsitaadiga

tsitaat:
counteri väärtus ei pruugi olla täpselt 0.3 vaid näiteks 0.29999... või 0.3000...01
Kuidas ta saab olla o,299 kui ma ju liidan juurde 0.1+0.1 ?? Kui ta läheb suuremaks võid ju panna if(counter>=0.3){counter=0.1;}

tsitaat:
Sellisel juhul suureneb counter 0.1 --> 0.2 --> 0.3 ja siis jääbki 0.3 juurde
Kas proovisid? Teine if peaks ju sel juhu, kui counter==0.3 selle ju muutma uuesti 0.1
Nagu juba ütlesin, siis võimalik, et see lahendus ei sobi Javale, kuid php, Qbasicus ja veel mõnes keeles, mida olen kasutanud selline asi täiesti toimib.

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 14.09.2008 14:51:42 vasta tsitaadiga

andrusny kirjutas:
tsitaat:
counteri väärtus ei pruugi olla täpselt 0.3 vaid näiteks 0.29999... või 0.3000...01
Kuidas ta saab olla o,299 kui ma ju liidan juurde 0.1+0.1 ?? Kui ta läheb suuremaks võid ju panna if(counter>=0.3){counter=0.1;}


float ja double väärtused on tegelikult kahendsüsteemi murdarvud ja need ei teisendu üks-ühele kümnendsüsteemi.

ehk tsükkel

double i = 0;
while (i != 1) {
i += 0.1;
}

ei lõppe kunagi ära, kuna i väärtuseks ei saa kunagi täpselt 1.000(0)
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 14.09.2008 14:57:45 vasta tsitaadiga

Tundub jah nii, tegin katseks jupi koodi JS ja tegi täpselt nii nagu öeldi, 0.1 0.2 ja 0.30004
Lahenduseks pakun sellist varianti. 10 korrutasin, kuna JS Math.round teisendab täisarvuks.


                       if(counter<0.3){counter=counter+0.1;}
                       if(Math.round(counter*10)==3){counter=0.1;}

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 14.09.2008 15:02:43 vasta tsitaadiga

Või siis nii:
if(counter<0.25){counter=counter+0.1;}
if(counter>0.25){counter=0.1;}
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
aatomik
HV kasutaja
aatomik

liitunud: 30.11.2005




sõnum 14.09.2008 15:21:32 vasta tsitaadiga

DoS kirjutas:
kui counter on 0.1, siis muudad 0.2'ks, muudel juhtudel 0.1'ks. nüüd tõlgi see javasse ja töötab


Tegelikult asi niivõrd lihtne oligi icon_redface.gif Viga jah ilmselt unises pühapäeva hommikus - käisin hingasin pisut värsket õhku, sõin kõhu täis ja sain valmis järgmise asjaga:

java:
  1. public class proov {
  2.         public static void main(String[] args) {
  3.                 double x;
  4.                 double y;
  5.                 double counter = 0.01;
  6.                
  7.                 for (x = 10; x > 0; x -= counter) {
  8.                        
  9.                         y = x + 1;
  10.                         System.out.println("y on: " + y);
  11.                         System.out.println("counter on: " + counter);
  12.                        
  13.                         if (counter == 0.01) {
  14.                                 counter = 0.02;
  15.                         } else if (counter == 0.02) {
  16.                                 counter = 0.01;
  17.                         }
  18.                        
  19.                 }
  20.         }
  21.  
  22. }


Tänud kõigile, kes pühapäevasel päeval pisut mõttetööd viitsisid arendada thumbs_up.gif
Kommentaarid: 14 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 14
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 14.09.2008 15:43:12 vasta tsitaadiga

Ma oleks sulle sellist varianti korra soovitanud, kuid hakkasin vaatama, et kui counter on 0.1 saab ta 0.2 ja järgmine vaatab, et kui on 0.2 saab uuesti 0.1
See on siis kui oleksid mõlemad if laused, kuid ma ei tulnud selle pealegi, et kui teine teha else if selline asi töötab. Tore.

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
guest1902
Kreisi kasutaja
guest1902

liitunud: 05.11.2005




sõnum 14.09.2008 17:53:33 vasta tsitaadiga

aatomik, sul mingi kala sees. Väike osa keset väljundit:
Spoiler Spoiler Spoiler

Minu väga robustne lahendus:
java:
  1. public class Kaunter{
  2.         public static void main(String[] args){
  3.                 double x, counter;
  4.                 for(x=10, counter=0.1; x>=0.1; x-=counter){
  5.                         counter=(counter==0.1)?0.2:0.1;
  6.                         System.out.println("x on "+Math.round(x*10)/10.0+
  7.                                         "\ncounter on nüüd "+counter+"\n---");
  8.                 }
  9.                 System.out.println("Ei lähe negatiivseks - piirdun nulliga");
  10.         }
  11. }
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 14.09.2008 20:48:57 vasta tsitaadiga

Panen oma variandi ka, kus on võimalikult vähe võrdlusi ebatäpsete arvude vahel.

java:
  1. public class Counter
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         double x = 10.0;
  6.         boolean f = false;
  7.  
  8.         while (x > 0.0)
  9.         {
  10.             System.out.println(String.format("%.1f", x));
  11.             x -= f ? 0.2 : 0.1;
  12.             f = !f;
  13.         }
  14.     }
  15. }

_________________
ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
aatomik
HV kasutaja
aatomik

liitunud: 30.11.2005




sõnum 14.09.2008 21:46:53 vasta tsitaadiga

Need mõlemad variandid töötavad jah ilusasti, Elrak oma samal põhimõttel nagu minugi oma ja trglodyte on asja ilusti booleani abil käima saanud thumbs_up.gif Alati hea näha, kuidas teised mingit probleemi lahendavad icon_wink.gif

Elrak kirjutas:
aatomik, sul mingi kala sees. Väike osa keset väljundit:
Spoiler Spoiler Spoiler


Kõik peaks toimima nii nagu vaja, counter jookseb 0.1 --> 0.2 intervalliga. Oma koodis ma väljastasin y väärtusi ka mitte x-id, nagu spoileri all sul märgitud on.
Kommentaarid: 14 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 14
tagasi üles
vaata kasutaja infot saada privaatsõnum
Nitro
HV kasutaja
Nitro

liitunud: 02.03.2004




sõnum 17.09.2008 10:28:55 vasta tsitaadiga

Saab ka nii, et paned mingi counteri lugema, mitmendat korda loop jookseb:

int counter=0;
double samm;
while (tingimus) {
  if (counter%2==0)  //kui on paaris arv
    samm=0.1;
  else
    samm=0.2;
  counter++;
}
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Java's counteri automaatne muutmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.