30. juni 2015 - 08:54Der 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}
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 :-)
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.
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.
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.
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).
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:
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.
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
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 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.
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.
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.
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 :-)
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!
Synes godt om
Ny brugerNybegynder
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.