Avatar billede trine_h Nybegynder
12. juni 2003 - 11:28 Der er 9 kommentarer og
1 løsning

talberegning i javascript

Jeg har et databaseudtræk på tal som er af typen currency.
et eksempel på tal kunne være 1,25
Javascriptet skal lægge disse tal sammen - problemet er at de afrundes nedad til heltal 1,25 bliver til 1.
Hvilken type skal de konverteres til for at undgå dette?
Avatar billede greatdane Nybegynder
12. juni 2003 - 11:46 #1
Jeg har set formularer, hvor de henter værdier ind med
  var tal1 = parseFloat(formular.felt1)
  var tal2 = parseFloat(formular.felt2)
  var res=tal1/tal2
  formular.res = res

Alle tal kan indtastes som decimaltal, og resultatet kommer ud som decimaltal.  Skal vi gætte på, at der så er en variabeltype Float?
Avatar billede greatdane Nybegynder
12. juni 2003 - 11:48 #2
Du kan se det brugt på f.eks. http://www.netdoktor.dk/testdigselv/Fakta/overvaegt.htm - se i sourcen og led efter beregnBMI.
Avatar billede roenving Novice
12. juni 2003 - 11:48 #3
Du skal sørge for at det er javascript talformat, altså skal der stå 1.25 ...

Javascript vil typisk behandle en parameter, som den tror den skal behandles og on-the-fly bestemme datatypen, derfor vil dine tal umiddelbart blive fortolket som tekst-strenge, men forsøger du at regne med dem, vil javascript forsøge at komme så langt, som den kan ...

Du bliver derfor nødt til at konvertere til javascript-talformat:

function makeNumber(tal){
  if (tal.indexOf(",")>-1){
    komma = tal.indexOf(",");
    return tal.substring(0,komma)+"."+tal.substring(komma+1);
  }
}

kør alle dine tal igennem den maskine før du regner med dem -- bagefter får du oftest brug for at formattere dem til de to decimaler, men start lige med at få den til at regne ordentligt !O)
Avatar billede trine_h Nybegynder
12. juni 2003 - 12:52 #4
roenving - det var lige sådan en konverteringsfunktion jeg manglede - tak for det. lig et svar.
Avatar billede roenving Novice
12. juni 2003 - 13:03 #5
Men tænk også på at konvertere til læselige tal bagefter '-)

-- javascript er nemlig hård i sin on-the-fly type-konvertering, så den laver det om til heltal, hvis den kan det, og du kan ikke bestemme antal decimaler, den viser i et i talformat ...

Tricket med det er så, at lægge "" til tallet (konvertere til tekst-streng), tælle hvor mange decimaler, der er og så afkorte eller forlænge til to decimaler ;O)
Avatar billede trine_h Nybegynder
13. juni 2003 - 14:19 #6
Jeg har fået følgende problem:
javascriptet regner simeplthen forkert feks. hvis jeg kalder beregn med: beregn(3000,1.15,"tekstfelt")
bliver resultat : 3449.9999999999995
i stedet for 3450!

        function beregn(str,str2,str3)
        {
        var stkpris = makeNumber(str);
        var antal = parseFloat(str2);
        var elementet = str3 + "_s";
        var stk_element = str3 + "_stk";
        eval("document.form1." + elementet).value = (stkpris * antal);
        eval("document.form1." + stk_element).value = stkpris;
        }
        function makeNumber(tal){
  if (tal.indexOf(",")>-1){
    komma = tal.indexOf(",");
    return tal.substring(0,komma)+"."+tal.substring(komma+1);
  }
  else return tal;
}
Avatar billede roenving Novice
13. juni 2003 - 14:30 #7
Ja, fordi et floating point value i princippet er et binært tal, bare i brøker, så det altid et eller andet sted er en tilnærmelse, i eksemplet:

1.15 = 1 + 0/2 + 0/4 + 1/8 + 0/16 + 0/32 + 1/64 + 1/128 osv.

Derfor skal du regne med specielt i javscript og andre af de typeløse, at du selv må lave afrunding ...

Hvis du f.eks. gør det samme i excel, vil du ikke sjøldent støde ind i det samme, hvis du kigger på de reelle værdier bagved præsentationen -- der er det bare standard at der laves en formattering inden brugeren ser det ...
Avatar billede trine_h Nybegynder
13. juni 2003 - 14:38 #8
kunne du evt. give et eksempel hvordan jeg laver afrunding - det ville være super...
Avatar billede roenving Novice
13. juni 2003 - 14:43 #9
tal = (Math.round(tal*100))/100;

-- og tak for points i øvrigt ;~}
Avatar billede roenving Novice
13. juni 2003 - 14:49 #10
Men ...

Det kommer an på, hvordan du skal bruge det, men jeg går ud fra, at det skal ende i et tekstfelt ...

function afrund(tal){
  tal = ""+(Math.round(tal*100))/100;
  punktum = tal.indexOf(".");
  if (punktum==-1)return tal+".00";
  if (tal.length-punktum==3)return tal;
  else return tal+"0";
}
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