Avatar billede ebea Ekspert
30. juni 2015 - 08:54 Der er 19 kommentarer og
1 løsning

Afrunding af decimaler

Hej! er der en som kan se hvorfor at følgende kodestump ikke kan afrunde korrekt, uden at tallene FØR punktummet ændrer sig til helt forkerte tal.
Jeg vil gerne kunne afrunde decimalerne ned til enten 2 (evt. 3) efter punktummet.
Jeg kan have op til 14 decimaler efter punktummet, eller mindre.

Det er en stump kode jeg har brugt fra nettet!

function setDecimal(value, places)
{    if (value < 0) {sign = "-"} else {sign = ""}
    value = Math.abs(value)
    factor = Math.pow(10, places)
    valInt = Math.round(value * factor)
    if (places == 0) {if (valInt == 0) {sign = ""}}
    if (places == 0) {return sign + valInt}
    valStr = valInt.toString(10)
    len = valStr.length
    radix = len - places - 1
        radShift = 0
        if (radix < 0) {radShift = -radix, radix = 0}
        for (var i = 0; i < radShift; i++) {valStr = "0" + valStr}
    intStr = valStr.substring(0, radix + 1)
    decStr = valStr.substring(radix + 2, len + radShift)
    valStr = sign + intStr + "." + decStr
    return valStr}

Håber at en kan se problemet!
Avatar billede ebea Ekspert
30. juni 2015 - 10:05 #2
Ja, jeg har prøvet den (og flere andre lignende), uden at det er endt med et resultat der lykkedes.

Jeg har egentlig brugt min kodestump i mange år, med afrunding af få decimaler, uden at se nogen problemer.
Men nu får jeg genereret nogle tal, som indeholder meget lange tal efter punktummet, og det er der at problemet er opstået :-)
Avatar billede erikjacobsen Ekspert
30. juni 2015 - 10:39 #3
Kan du give en række eksempler på hvad du vil, og hvad der så ikke virker?
Avatar billede ebea Ekspert
30. juni 2015 - 10:55 #4
Ja, jeg sætter lidt tal på.

Udgangspunktet, er tal som genereres fra et meget kompleks script, til beregning af Sol og Måne positioner. Og dette script genererer hele tiden nye positioner, som kan bestå af følgende eks. Og jeg kan ikke ændre i dette script, så det kun leverer afrundede cifre. Derfor må jeg gøre det efter at tallet er genereret. (se live på www.vejrdata.dk) under sol og måne positioner.

121.86249228334158
152100742.54925576
-51.90849668518334

Når jeg afrunder disse tal, til at ende med f.eks. 2 decimaler, så ændrer tallet før punktummet sig, til at være højere. Og det burde egentlig kun være tallet efter punktummet, som blir' afrundet.

Jeg bruger så koden ud fra scriptet til at afrunde med.    setDecimal(121.86249228334158,2);
i det tilfælde, afrundes med 2 decimaler.
Avatar billede erikjacobsen Ekspert
30. juni 2015 - 11:10 #5
Hvis jeg ellers har kopieret koden korrekt fra spørgsmålet her, så kan jeg kan se et problem i afrundingen: Tallet lige efter "kommaet" kommer ikke med, men tallene før "kommaet" er da uændrede. Og toFixed ser rigtigere ud. 

http://n0p.com/1004567.html
Avatar billede ebea Ekspert
30. juni 2015 - 14:52 #6
Jeg tester det senere i aften. Tak, indtil videre!
Avatar billede ebea Ekspert
30. juni 2015 - 17:17 #7
Så fik jeg kigget lidt mere på dit eksempel (og tak).
Isoleret set, så virker dit eksempel som det skal. Men det er fordi at "outputtet" leveres inde i selve scriptet.

Mit problem er, at jeg skriver kaldet til scriptet, udenfor scriptet, og kalder funktionen med et id kald (.getElementById)

Forklaring:
Scriptet som kaldes, indeholder følgende, for at kunne hente beregningen (tallene).

  document.getElementById('sun_azimuth').innerHTML = sun_horizontal.azimuth;

I den del som skal levere tallene på siden, sætter jeg så følgende linje:

<span id="sun_azimuth"></span>
Og det er her at tallet leveres. Jeg har så i mit script som laver afrundingen, indsat setDecimal som følger i linjen herunder, for at lave afrundingen:

document.getElementById('sun_azimuth').innerHTML = setDecimal(sun_azimuth,2);

Så jeg er på en eller anden måde, nødt til at få afrundingen til at køre i ovenstående linje, og ikke ved at lave et nyt script på siden (dit eksempel), hvor afrundingen så laves.
Det har jeg prøvet (af flere gange) og med negativt resultat hver gang.
Scriptet som laver beregningen af tallene, leverer ikke tallene, hvis jeg prøver dette.
Og som start på spørgsmålet, så blir' tallene forkerte foran punktummet, når jeg bruger mit eks. setDecimal i kodelinjen.

Jeg har indsat din 'var a =' i scriptet som afrunder, uden at få det til at virke.
Avatar billede erikjacobsen Ekspert
30. juni 2015 - 18:46 #8
Jeg synes nu ikke afrundingen er ok. Men det er op til dig.

Selv med innerHTML giver det samme resultat. Hvis vi ikke kan fremprovokere fejlen, er det godt nok svært at rette. http://n0p.com/1004567.html er opdateret
Avatar billede ebea Ekspert
30. juni 2015 - 19:01 #9
Indtil videre tak! Nej, for mig er det vigtigt at tallene, både kan afrundes, men og også er korrekte efter afrundingen (endda meget vigtigt).
Er det muligt, at jeg kan sende dig et eksempel, hvor de samme beregninger og værdier indgår (2 filer).

Så kan du selv prøve at se, hvad det er jeg mener, og hvad det er der sker, når tallene genereres.

Jeg kan gi dig min mail her, hvis du vil prøve at kigge på de 2 test filer, som laver det samme som det i mit eksempel.

Det er en .JS fil og så en html fil.
Avatar billede erikjacobsen Ekspert
30. juni 2015 - 19:10 #10
Kun kommunikation over eksperten.dk - til gengæld slipper du for en regning ;)
Avatar billede ebea Ekspert
30. juni 2015 - 19:27 #11
Det er bare ok Erik!
Men jeg har kigget på dit nye forslag, og der er ingen ændring med hensyn til fejlen.

jeg kan sagtens få dine (og andre tal) til at passe, hvis jeg bruger document.write funktionen, som leverer det afrundede tal i selve scriptet; men det skulle gerne levere det afrundede tal, i det samme kald som leverer tallet (tallet med de mange cifre). Og det er her det går galt, og tallet bliver forkert. Jeg kalder jo på tallet (og får det leveret) UDEN for scriptet (med byID), og ikke som i dit eks. med document.write funktionen, INDE i scriptet.

Det er lidt svært at forklare nærmere, men havde været nemmere med en eksempel fil :-)
Jeg håber virkelig at der kunne findes en løsning, da det er et irritationsmoment.

Grundlæggende, er det fordi jeg vil have ryddet op i min gamle vejrside (+10 år), og få smidt nogle af alle de små script væk, som ikke er i brug mere, og så generel oprydning, med nyere scripttyper.
Avatar billede ebea Ekspert
30. juni 2015 - 19:42 #12
Du kan se forskellen her på tallene, når jeg laver afrundingen.

korrekt tal:  287.62472947346123

efter afrunding:  303.59

Det er egentlig ens for alle tal. Men den største forskel i afrundingen, sker egentlig på det tal der hedder azimuth beregningen, uden at jeg kan forklare hvorfor.
Avatar billede erikjacobsen Ekspert
30. juni 2015 - 19:49 #13
303.58 - det synes umuligt at opnå med den funktion du har vist her. Der må være et problem et andet sted.
Avatar billede ebea Ekspert
30. juni 2015 - 20:04 #14
Ja, afvigelsen er stor. Men jeg har kigget igennem masser af gange, uden at finde årsagen.

Så snart at jeg indsætter setDecimal i scriptet, går det galt.
Avatar billede ebea Ekspert
30. juni 2015 - 20:11 #15
Du kan prøve at tage et kig på filen i nedenstående link, og som egentlig er det som er udgangspunktet.

http://www.vejrdata.dk/ephemeris.html

Der kan du se i kildekoden, og se om det gør min forklaring nemmere at forstå.
Avatar billede erikjacobsen Ekspert
30. juni 2015 - 20:43 #16
Det du viser er så et eksempel uden brug af setDecimal - jeg ville skulle anstrenge mig rigtig meget for at prøve at fremprovokere dit problem. Og det er sommer, så det går ikke.

Nå, men funktionen setDecimal er jo også griset javascript - de variabler, der anvendes lokalt står der ikke "var" foran. Dermed bliver de globale. Det skulle ikke betyde noget, da de alle får en værdi i funktionen, men det kan jo eventuelt rettes.
Avatar billede ebea Ekspert
30. juni 2015 - 22:08 #17
Det var blot for at vise, hvad det er som sker i kaldet til scriptet, og hvor resultatet ender.

setDecimal funktionen, kan jo ses på det som jeg har angivet i #7

og i linket med eksemplet, kan du se de samme linjer.

Jeg må prøve at se om andre kommer på banen, eller se om jeg finder en løsning på problemet, ad anden vej.
Avatar billede erikjacobsen Ekspert
30. juni 2015 - 22:43 #18
Jeg kan som sagt ikke genskabe problemet, og dermed ikke løse det.

Hvis du kan, så er du velkommen til at vise det.
Avatar billede ebea Ekspert
30. juni 2015 - 22:57 #19
Jeg er kommet så langt nu, at det ligger i selve min html fil. Ikke i scriptene. jeg har efterprøvet dette, ved at lave en ny test af den fil som jeg egentlig havde vist i linket i #15 - og der vises afrundingen korrekt!!!!!!

Det der så underbygger at fejlen ligger et sted i html delen, er at der er forskel på hvad for et tal der afrundes, og hvad det afviger :-)
Avatar billede ebea Ekspert
03. juli 2015 - 12:18 #20
Er kommet så langt, at jeg har fået indkredset fejlen, til kun at gælde ét punkt, med afrunding. Så jeg håber at få fundet den sidste fejl også.
Så lukker spørgsmålet.

Tak for hjælpen!
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

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