Avatar billede hansen Nybegynder
07. februar 2009 - 14:46 Der er 10 kommentarer og
1 løsning

Regner forkert sammen?

nedenstående script regner forkert sammen på decimalerne, kan du hjælpe mig med at fortælle hvad der går galt?

En sammenlægning af en række tal burde give 384,60 men gav
384.59999999999996,-

Scriptet er sammensat af lidt fra eksperten:
<script language="JavaScript">

function  beregn()
{
    var temp = 0;
    var pris = 0;
    if  (document.formular.bil1.value  >  0)
    {
        temp  =  temp  +  (document.formular.bil1.value  *  34.40);
    }
    if  (document.formular.bil2.value  >  0)
    {
        temp  =  temp  +  (document.formular.bil2.value  *  68.80);
    }
    if  (document.formular.bil3.value  >  0)
    {
        temp  =  temp  +  (document.formular.bil3.value  *  56.45);
    }
    if  (document.formular.bil4.value  >  0)
    {
        temp  =  temp  +  (document.formular.bil4.value  *  112.90);
    }
    if  (document.formular.pers1.value  >  0)
    {
        temp  =  temp  +  (document.formular.pers1.value  *  12.20);
    }
    if  (document.formular.pers2.value  >  0)
    {
        temp  =  temp  +  (document.formular.pers2.value  *  24.4);
    }
    if  (document.formular.pers3.value  >  0)
    {
        temp  =  temp  +  (document.formular.pers3.value  *  6.10);
    }
    if  (document.formular.pers4.value  >  0)
    {
        temp  =  temp  +  (document.formular.pers4.value  *  12.20);
    }
    if  (document.formular.pers5.value  >  0)
    {
        temp  =  temp  +  (document.formular.pers5.value  *  6.10);
    }
    if  (document.formular.pers6.value  >  0)
    {
        temp  =  temp  +  (document.formular.pers6.value  *  12.20);
    }
    if  (document.formular.pers7.value  >  0)
    {
        temp  =  temp  +  (document.formular.pers7.value  *  0);
    }
    if  (document.formular.pers8.value  >  0)
    {
        temp  =  temp  +  (document.formular.pers8.value  *  0);
    }
    if  (document.formular.trailer1.value  >  0)
    {
        temp  =  temp  +  (document.formular.trailer1.value  *  17.85);
    }
    if  (document.formular.trailer2.value  >  0)
    {
        temp  =  temp  +  (document.formular.trailer2.value  *  35.70);
    }
    if  (document.formular.trailer3.value  >  0)
    {
        temp  =  temp  +  (document.formular.trailer3.value  *  33.60);
    }
    if  (document.formular.trailer4.value  >  0)
    {
        temp  =  temp  +  (document.formular.trailer4.value  *  67.20);
    }
    if  (document.formular.trailer5.value  >  0)
    {
        temp  =  temp  +  (document.formular.trailer5.value  *  45.10);
    }
    if  (document.formular.trailer6.value  >  0)
    {
        temp  =  temp  +  (document.formular.trailer6.value  *  90.20);
    }
    if  (document.formular.mcyc1.value  >  0)
    {
        temp  =  temp  +  (document.formular.mcyc1.value  *  17.40);
    }
    if  (document.formular.mcyc2.value  >  0)
    {
        temp  =  temp  +  (document.formular.mcyc2.value  *  34.80);
    }

    pris  =  eval(temp)
    document.formular.resultat.value  =  pris;
    };
   
    </script>

og bliver vist i et formfelt:
<input name="resultat" type="text" size="2" colspan="2"/>


Tak for hjælpen.
Avatar billede psychopixi Nybegynder
07. februar 2009 - 14:58 #1
Det er meget almindeligt at en computer regner forkert, når man har at gøre med rigtigt mange decimaler.
Prøv om det hjælper at afrunde dit resultat med fx:

var result = Math.round(eval(temp)*100)/100


Herved får du et resultat med to decimalers nøjagtighed.
Note: jeg har ikke testet ovenstående, men det burde virke:)
Avatar billede nicklasb Nybegynder
07. februar 2009 - 16:01 #2
Hvis du blot afrunder resultatet, får du højst sandsynligt et resultat der hedder 384.59 (hvilket vist ikke er som ønsket.)
Du bliver nok nød til at afrunde noget oftere .. Koden er desuden enormt redundant (- nu ved jeg ikke hvad beregningen skal bruges til, men hvad gør du hvis du finder ud af, at de enkelte felters værdier skal være over 10 og ikke 0 som i din nuværende kode? Så skal du til at rette rigtig meget kode ..)

Prøv eventuelt med noget i retningen af:
<script>
function beregn() {
    var fields = new Array(
        new Array(document.formular.bil1.value, 34.4),
        new Array(document.formular.bil2.value, 68.8),
        new Array(document.formular.bil3.value, 56.45),
        new Array(document.formular.bil4.value, 112.9)
    );

    var pris = 0;
    for(var i = 0; i < fields.length; i++)
        if (fields[i][0] > 0)
            pris += Math.round(fields[i][0] * fields[i][1] * 100)/100;
    document.formular.resultat.value = Math.round(eval(pris) * 100)/100;
}
beregn();
</script>
Avatar billede psychopixi Nybegynder
07. februar 2009 - 16:07 #3
#2
Nej. Round af 384.59999999999996 vil med min metode give 384.60, men bortset fra det er jeg enig med dig:)
Avatar billede olebole Juniormester
07. februar 2009 - 18:49 #4
<ole>

Hvad gør eval i jeres forslag (og det oprindelige spm)? Det er JavaScripts dårligst performende funktion, så den bør absolut ikke anvendes uden grund ... som her  ;o)

Derudover er det nicklasb's forslag, der give mening. Priser skal rundes af til to decimaler, før de lægges sammen  =)

/mvh
</bole>
Avatar billede nicklasb Nybegynder
07. februar 2009 - 19:00 #5
Jeg ved ikke hvorfor han kører eval og har kun taget det med i et lidt for groft copy'n'paste. Men nej - kan ikke umiddelbart set nogen god grund til det ..
Avatar billede hansen Nybegynder
08. februar 2009 - 13:38 #6
Hej niclasb, jeg har forsøgt mig lidt med din kode og er kommet frem til følgende;

<script language="JavaScript">
function beregn() {
    var fields = new Array(
        new Array(document.formular.bil1.value, 34.4),
        new Array(document.formular.bil2.value, 68.8),
        new Array(document.formular.bil3.value, 56.45),
        new Array(document.formular.bil4.value, 112.9),
        new Array(document.formular.pers1.value, 12.20),
        new Array(document.formular.pers2.value, 24.4),
        new Array(document.formular.pers3.value, 6.10),
        new Array(document.formular.pers4.value, 12.20),
        new Array(document.formular.pers5.value, 6.10),
        new Array(document.formular.pers6.value, 12.20),
        new Array(document.formular.pers7.value, 0),
        new Array(document.formular.pers8.value, 0),
        new Array(document.formular.trailer1.value, 17.85),
        new Array(document.formular.trailer2.value, 35.70),
        new Array(document.formular.trailer3.value, 33.60),
        new Array(document.formular.trailer4.value, 67.20),
        new Array(document.formular.trailer5.value, 45.10),
        new Array(document.formular.trailer6.value, 90.20),
        new Array(document.formular.mcyc1.value, 17.40),
        new Array(document.formular.mcyc2.value, 34.80)

    );

    var pris = 0;
    for(var i = 0; i < fields.length; i++)
        if (fields[i][0] > 0)
            pris += Math.round(fields[i][0] * fields[i][1] * 100)/100;
    document.formular.resultat.value = Math.round(eval(pris) * 100)/100;
}
beregn();
</script>

Men det giver mig en fejl i kørsel af scriptet,
Fejl: document.formular has no properties

det er i denne linie,
new Array(document.formular.bil1.value, 34.4),

kan du komme med et bud på hvad der er galt?

Tak for hjælpen.
Avatar billede nicklasb Nybegynder
08. februar 2009 - 14:30 #7
Kan du smide et link eller poste din form? Jeg kaldte blot felterne på samme måde, som du selv har gjort det i dit eksempel.

Du husker at have name på din form, ikke?
Avatar billede hansen Nybegynder
08. februar 2009 - 15:45 #8
Jow, der er name på formularen, du kan se siden her,
http://www.karolinematilde.dk/formular/reservation2_german.asp
Avatar billede nicklasb Nybegynder
08. februar 2009 - 15:56 #9
Det er fordi du kalder metoden beregn() inden fomularen er defineret. Hvis det er nødvendigt at kalde funktionen før brugeren indtaster data, kan du rykke det ned under formularen. Altså slette den i linje 134 og flytte den ned i bunden af siden ..
Avatar billede hansen Nybegynder
11. februar 2009 - 20:04 #10
Hej nicklasb, så virker det, mange tak for hjælpen.
Giver du et svar, tak.
Avatar billede nicklasb Nybegynder
11. februar 2009 - 21:48 #11
:)
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