Avatar billede jscrtipteren Nybegynder
09. maj 2001 - 10:26 Der er 12 kommentarer og
2 løsninger

Fejl ved beregning i Javascript

Hej Eksperter,
Jeg skal lave en simpel beregning via Jscript:
alert((544.31*2)+(544.31*1))

bliver et helt forkert tal:
1632.9299999998 og det rigtige tal er jo som bekendt 1632.3 - hvad gør jeg galt??
Avatar billede dudal Nybegynder
09. maj 2001 - 10:35 #1
Når jeg regner det ud på min lommeregner, giver det det første tal.

/dudal
Avatar billede jscrtipteren Nybegynder
09. maj 2001 - 10:39 #2
544.31*2=1088.62
544.31*1=544.31

1088.62 + 544.31 = 1632.3

hvordan regner du det da ud?? Husker du at opdele regnestykket jf. parantes reglerne?

Avatar billede dudal Nybegynder
09. maj 2001 - 10:45 #3
Jeps... Det gør jeg.

Hvis du ser på decimalerne i det:

62 og 31. Det er lig 93.

Så har du selve tallene som er 1088 og 544 hvilket giver 1632

Altså: 1632+0,93 = 1632,93

Jeg ved ikke helt hvor du har 1632,3 fra????

/dudal
Avatar billede erikjacobsen Ekspert
09. maj 2001 - 10:46 #4
det giver da 1088.62+544.31 = 1632.93
Avatar billede jscrtipteren Nybegynder
09. maj 2001 - 10:47 #5
nåååå.... undskyld jeg har skrevet forkert. Javascriptet burde returnere 1632,93 - men det gør det jo ikke!
Det returnerer 1632.9299999998 - hvorfor gør det det? og hvordan søre man for at den kan regne rigtigt?
Avatar billede erikjacobsen Ekspert
09. maj 2001 - 10:51 #6
Ja, men den regner med maskintal, og der passer det. HVis du ved der er
to decimaler kan du

a=(544.31*2)+(544.31*1);
alert(Math.round(100*a)/100);
Avatar billede jscrtipteren Nybegynder
09. maj 2001 - 10:54 #7
det er da vildt underligt at man skal afrunde noget som slet ikke burde give et så underligt tal.
Tallet bliver jo ikke uendeligt tæt på 1632.93 det giver præcis 1632.93, så det er da helt hen i skoven at den ikke regner det ud til det, er det ikke?

Har jeg sovet i datalogi timerne?
Avatar billede hoejrup Nybegynder
09. maj 2001 - 10:54 #8
Prøv med

alert(round((544.31*2)+(544.31*1)),2)

/per
Avatar billede erikjacobsen Ekspert
09. maj 2001 - 11:03 #9
Jah, i version 4 browsere skal man nu huske at skrive Math.round, og
de tager ikke den der \"antal decimaler\" parameter. Nyere browsere,
måske, hvem ved?
Avatar billede erikjacobsen Ekspert
09. maj 2001 - 11:04 #10
Ja, jscrtipteren, du har \"sovet\". Maskintal repræsenteres ikke med
tiendedele, men halve, kvarte, ottendele osv. Derfor kan dit tal
ikke repræsenteres bedre i maskinen.
Avatar billede jakoba Nybegynder
09. maj 2001 - 11:15 #11
Den almindeligste løsning når man regner med kroner,ører og andre steder hvor decimalerne ikke må \"gå amok\" er at starte med at omregne alt til ører så det er heltal der regnes med hele vejen igennem.
tilsidst stopper man så et kommategn ind foran de to sidste cifre idet man udskriver:

  val1 = Math.round(544.31*100);
  val2 = Math.round(544.31*100);
  res = val1*2 + val2;
  if ( res<100 ) {
    res = \"00\"+res;
    res = res.substring(res.length-3);
  } else
    res = \"\"+res;
  alert( \"\" +res.substring(1,res-2) +\",\" +res.substring(res-2);

mvh JakobA
Avatar billede jakoba Nybegynder
09. maj 2001 - 11:17 #12
Ups:  der mangler en slutparentes forenden af min alert:
  alert( \"\" +res.substring(1,res-2) +\",\" +res.substring(res-2) );
Avatar billede hoejrup Nybegynder
09. maj 2001 - 11:17 #13
Her er der et eksempel du kan anvende:

http://www.developer.irt.org/script/1494.htm

/per
Avatar billede jscrtipteren Nybegynder
09. maj 2001 - 12:18 #14
Tak for hjælpen gutter!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester