Avatar billede flashnoob Nybegynder
17. april 2007 - 19:51 Der er 22 kommentarer og
1 løsning

Decimaltal dur ikke ved udregning

Hej!
Jeg har lavet en lille kalorieudregner, som jeg kan bruge til at holde styr på mit kalorieindtag.. Og jeg var mægtig stolt over at jeg kunne lave den i JavaScript, men den glæde holdte kun kort :( .
Jeg opdagede nemlig at man ikke kan lave udregninger med decimaltal :( (kodningen er sikkert også noget skrammel, men jeg prøvede da.)

Hvordan får jeg scriptet til at kunne regne med decimaltal?

function calculate_kcal(){
        var proteine, carbonhydrate, fat;
        var allenergy;
        var kcal_energy;
        var kj_energy;
        var weight;
        var total_kcal;
        var total_kj;
       
        proteine = parseInt(document.getElementById("proteine").value)*4;
        carbonhydrate = parseInt(document.getElementById("carbonhydrate").value)*4;
        fat = parseInt(document.getElementById("fat").value)*9;
       
        kcal_energy = proteine+carbonhydrate+fat;
        kj_energy=kcal_energy*4.18400;
       
        document.getElementById("energy_kcal").value = kcal_energy;
        document.getElementById('energy_kcal').value=Math.round(document.getElementById('energy_kcal').value*100)/100; //afrunder til 2 decimaler.
       
        document.getElementById('energy_kj').value=kcal_energy*4.18400;
        document.getElementById('energy_kj').value=Math.round(document.getElementById('energy_kj').value*100)/100; //afrunder til 2 decimaler.
}
Avatar billede thesurfer Nybegynder
17. april 2007 - 21:47 #1
Du skal huske at erstatte "," med ".".. eller omvendt.. :-)

Eksempel:

function erstat(vaerdi)
{
vaerdi = vaerdi.replace(",", ".");
return vaerdi;
}

og så din kode:

        proteine = parseInt(erstat(document.getElementById("proteine").value))*4;



Det kan godt være, at det skal være vaerdi.replace(",", ".") .. men jeg tvivler..
Avatar billede thesurfer Nybegynder
17. april 2007 - 21:48 #2
Rettelse:

Det kan godt være, at det skal være vaerdi.replace(".", ",") .. men jeg tvivler..

Dvs, Det kan godt være, at "." skal erstattes med ",".. men jeg tvivler.. :-)
Avatar billede flashnoob Nybegynder
17. april 2007 - 21:55 #3
Hej thesurfer.
Jeg kom også i tanke om det samme, så jeg har allerede en replace i koden ved inputfeltet, så det ser sådan ud:
onKeyUp="this.value = this.value.replace(',', '.'); calculate_kcal();"

Men det virker ikke :(
Avatar billede thesurfer Nybegynder
17. april 2007 - 22:02 #4
Hvilke værdier indtaster du? Virker det med heltal, dvs, uden "," og "." ?
Avatar billede thesurfer Nybegynder
17. april 2007 - 22:03 #5
Ved "Math.round" parser du ikke til int.. Prøv lige at parse der også..
Avatar billede flashnoob Nybegynder
17. april 2007 - 22:17 #6
Jeg indtaster f.eks. for M&M's chokolade (namnam :p):
(protein) 5,2
(kulhydrat)71,5
(fedt)17,5

Det skulle så gerne vise 1951 KJ og 464 kcal.

Men den udregner ikke, med mindre jeg runder op til nærmeste heltal.

Nu har jeg:
        document.getElementById('energy_kcal').value=parseInt(Math.round(document.getElementById('energy_kcal').value*100))/100;

Var det sådan du mente? (der sker nemlig ikke noget, stadig det samme..)
Avatar billede thesurfer Nybegynder
17. april 2007 - 22:21 #7
Nej, jeg mente: Math.round(parseInt(document.getElementById('energy_kcal').value) * 100)

Men du skal lige være opmærksom på, at parseInt runder af til heltal.. dvs, ingen kommatal..

Ellers skal du bruge parseFloat(...)..
Avatar billede flashnoob Nybegynder
17. april 2007 - 23:10 #8
ahaa! Det prøvede jeg også lige. Men det ser stadig ikke ud til at virke.
Du får lige hele koden:

<!------------ udregn.js ------------------>

function calculate_kcal(){
        var proteine, carbonhydrate, fat;
        var allenergy;
        var kcal_energy;
        var kj_energy;
        var weight;
        var total_kcal;
        var total_kj;
       
        proteine = parseInt(erstat(document.getElementById("proteine").value))*4;
        carbonhydrate = parseInt(erstat(document.getElementById("carbonhydrate").value))*4;
        fat = parseInt(erstat(document.getElementById("fat").value))*9;
       
        kcal_energy = proteine+carbonhydrate+fat;
        kj_energy=kcal_energy*4.18400;
       
        document.getElementById("energy_kcal").value = kcal_energy;
        document.getElementById('energy_kcal').value=Math.round(parseFloat(document.getElementById('energy_kcal').value) * 100)/100; //afrunder til 2 decimaler.
       
        document.getElementById('energy_kj').value=kcal_energy*4.18400;
        document.getElementById('energy_kj').value=Math.round(parseFloat(document.getElementById('energy_kj').value) * 100)/100; //afrunder til 2 decimaler.
}

<!------------ index.php ------------------>

<input type="text" id="proteine" name="proteine" maxlength="5" onKeyUp="calculate_kcal();">

<input type="text" id="carbonhydrate" name="carbonhydrate" maxlength="5"  onKeyUp="calculate_kcal();">

<input type="text" id="fat" name="fat" maxlength="5" onKeyUp="calculate_kcal();">

<input type="text" id="energy_kj" disabled="disabled" name="energy_kj" maxlength="6">
<input type="text" id="energy_kcal" disabled="disabled" name="energy_kcal" maxlength="5">
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:20 #9
Hvis det ikke virker, må du vel få en fejlmeddelse?
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:23 #10
Hvad har du gjort af min "erstat"-funktion? :-)

Du kalder den her, men jeg kan ikke se funktionen i indlægget 17/04-2007 23:10:36 :

        proteine = parseInt(erstat(document.getElementById("proteine").value))*4;
        carbonhydrate = parseInt(erstat(document.getElementById("carbonhydrate").value))*4;
        fat = parseInt(erstat(document.getElementById("fat").value))*9;
Avatar billede flashnoob Nybegynder
17. april 2007 - 23:33 #11
ups.. den er der, jeg havde bare ikke fået den med i indlægget :-)

Nej der kommer ingen fejlmeddelelse. Problemet er 'blot' at der står 1912 KJ / 457 kcal i stedet for 1951 KJ / 464 kcal (som der står på emballagen).. samme problem med andre produkter. Så det er de decimaler der ikke bliver regnet med :-/
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:33 #12
Jeg har rettet parseInt til parseFloat, alle steder.. og sat erstat-funktionen i .js filen..
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:35 #13
Jeg har brugt værdierne:

(protein) 5,2
(kulhydrat)71,5
(fedt)17,5

Og får:

1942.63 KJ
464.3 kcal
Avatar billede flashnoob Nybegynder
17. april 2007 - 23:40 #14
Hm! Det var bare mig der ikke havde tænkt mig om. Jeg havde ikke sat de 3 første parseInt til parseFloat!!! ups..
Men nu virker det. 1000 tak thesurfer. smid et svar.
Avatar billede flashnoob Nybegynder
17. april 2007 - 23:42 #15
btw. Det er vel egentlig ikke den mest 'sobre' kodning?? Man kan vel godt korte hele js -koden ned, kan man ikke?
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:45 #16
Jeg kan ikke se, hvorfor du bruger disse linier 2 gange hver:

        document.getElementById("energy_kcal").value = kcal_energy;
        document.getElementById('energy_kcal').value=Math...
       
        document.getElementById('energy_kj').value=kcal_energy*4.18400;
        document.getElementById('energy_kj').value=Math...

Men ellers ser det normalt ud..

- Svar.
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:46 #17
En lille rettelse/forbedring til dit script:

Math.round(parseFloat(...))

Her aflæser du værdien via document igen.. i stedet for at putte værdien i en variabel..
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:47 #18
Hmm.. måske vrøvler jeg nu.. :-)

Må nok hellere kigge nærmere på koden.. :-)
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:50 #19
udregn.js ser nu sådan ud:

function calculate_kcal(){
        var proteine, carbonhydrate, fat;
        var allenergy;
        var kcal_energy;
        var kj_energy;
        var weight;
        var total_kcal;
        var total_kj;
       
        proteine = parseFloat(erstat(document.getElementById("proteine").value))*4;
        carbonhydrate = parseFloat(erstat(document.getElementById("carbonhydrate").value))*4;
        fat = parseFloat(erstat(document.getElementById("fat").value))*9;
       
        kcal_energy = proteine+carbonhydrate+fat;
        kj_energy=kcal_energy*4.18400;
       
        document.getElementById('energy_kcal').value=Math.round(kcal_energy * 100)/100; //afrunder til 2 decimaler.
        document.getElementById('energy_kj').value=Math.round(kj_energy * 100)/100; //afrunder til 2 decimaler.
}

function erstat(vaerdi)
{
vaerdi = vaerdi.replace(",", ".");
return vaerdi;
}
Avatar billede flashnoob Nybegynder
17. april 2007 - 23:53 #20
Aha.. Jeg takker og bukker. :)
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:54 #21
Det var så lidt.. takker for points.. :-)
Avatar billede thesurfer Nybegynder
17. april 2007 - 23:56 #22
Så vidt jeg kan se, på den kode du har vist mig, bruger du ikke disse variabler:

        var allenergy;
        var weight;
        var total_kcal;
        var total_kj;

Variablerne eksisterer kun i denne funktion..
Så hvis du ikke tilføjer mere kode til funktionen calculate_kcal, kan du lige så godt fjerne de variabler..

:-)
Avatar billede flashnoob Nybegynder
18. april 2007 - 08:26 #23
Variablerne bliver brugt senere i funktionen. Jeg pastede bare ikke den kode ind, da den virker fint. :)
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