/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
Problem med at lægge tal sammen i javascri~
Fra : Chrisser


Dato : 28-04-05 14:46

Hej

Jeg har en funktion der bla. skal tjekke at nogle tal i en form går lige op
( giver nul ), og den har sådan set virket fint i et stykke tid.
Nu har jeg fået mig et problem, den tænder helt af ved visse tal, eks:
1. tal: -19.351,78
2. tal: 15.986,78
3. tal: 3.365,00

Når de to første lægges sammen giver den -3364.999999999998 og når det
tredie lægges til giver den
1.8189894035458565e-12


Jeg har lavet en lille test(), og hvis man adderer det negative beløb til
sidst går det godt - det gør det også hvis man lægger dem sammen på én
gang - men jeg har en del linier jeg gennemløber i en løkke så det kan jeg
ikke bruge til noget....

function testAdd(){
var a = new Number(-19351.78);
var b = new Number(15986.78);
var c = new Number(3365.00);
var res1= 0;
var res2= 0;

res1 = a.valueOf() + b.valueOf();
alert(res1: ' + res1);
res1 = res1 + c.valueOf();

res2 = b.valueOf() + c.valueOf();
alert(res1: ' +res2);
res2 = res2 + a.valueOf();


alert(res1: ' + res1);
alert(res1: ' +res2);

}

Det skal lige siges at jeg har prøvet med og uden parseFloat, new
Number()/valueof osv. og det giver det samme...

Er der nogen der ved hvad der sker og/eller har fundet en workaround/lavet
deres egen funktion til addition ?

Mvh
Chrisser



 
 
Jens Gyldenkærne Cla~ (28-04-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 28-04-05 15:33

Chrisser skrev:

> Er der nogen der ved hvad der sker og/eller har fundet en workaround/lavet
> deres egen funktion til addition ?

Det er tydeligvis en afrundingsfejl - der er en begrænset præcision når
computeren skal regne, og det kan netop give denne slags fejl.

Du kan runde af til et fast antal decimaler når du når den endelige
resultat - så skulle du stadig kunne tjekke i forhold til nul.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Benny Nissen (28-04-2005)
Kommentar
Fra : Benny Nissen


Dato : 28-04-05 15:52

Chrisser wrote:

> Nu har jeg fået mig et problem, den tænder helt af ved visse tal, eks:

Det kører vel på en gammel Pentuim CPU

Du ved, fra dengang AMD skrev "99% Pentium kompatibel - den sidste % vil
du ikke have alligevel".

--
Benny

Jens Gyldenkærne Cla~ (28-04-2005)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 28-04-05 22:17

Chrisser skrev:

> Jeg har lavet en lille test(),

Det er vist gået lidt stærkt med at skrive den af - eller også har
dit newsprogram spist nogle anførselstegn.

Her er en udgave der virker (altså demonstrerer fejlen):

<script type="text/javascript">
var a = new Number(-19351.78);
var b = new Number(15986.78);
var c = new Number(3365.00);
var res1= 0;
var res2= 0;

res1 = a.valueOf() + b.valueOf();
alert('res1: ' + res1);
res1 = res1 + c.valueOf();

res2 = b.valueOf() + c.valueOf();
alert('res2: ' +res2);
res2 = res2 + a.valueOf();


alert('res1: ' + res1);
alert('res2: ' +res2);

</script>

> Er der nogen der ved hvad der sker og/eller har fundet en
> workaround/lavet deres egen funktion til addition ?

Hvis du putter Math.round omkring res1 i ovenstående script, får du
et nydeligt rundt 0.

Jeg faldt i øvrigt over følgende informative side:
<http://www.devx.com/webdev/Article/17215/1954?pf=true>
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Chrisser (29-04-2005)
Kommentar
Fra : Chrisser


Dato : 29-04-05 07:11

Jens Gyldenkærne Clausen wrote:
> Det er vist gået lidt stærkt med at skrive den af - eller også har
> dit newsprogram spist nogle anførselstegn.

Jeg kopierede det direkte, så det sidste er nok det mest sansynlige

>> Er der nogen der ved hvad der sker og/eller har fundet en
>> workaround/lavet deres egen funktion til addition ?
>
> Hvis du putter Math.round omkring res1 i ovenstående script, får du
> et nydeligt rundt 0.

Mine tal er i kroner & ører - altså 2 decimaler og det skal give præcist
0,00 ( det kan godt være jeg ikke fik pointeret dette i mit første indlæg )
og såvidt jeg kan se, kan jeg jo så desværre ikke bruge math.round ( det
ville være noget andet hvis jeg kunne angive antal decimaler ).

> Jeg faldt i øvrigt over følgende informative side:
> <http://www.devx.com/webdev/Article/17215/1954?pf=true>

Den skal vist lige læses grundigt, det ser desværre ikke ud til at den kan
give mig en løsning men forståelse er vel heller ikke så dårligt.

Huskede jeg at fortælle at den godt kan klare de tre tal i alle rækkefølger
hvis man lægger dem sammen på én gang ?

- lige nu er jeg ude i en teori om at samle det hele i en streng og se om
jeg kan få eval til at regne på den i et hug - nu har jeg det bare sådan at
jeg er usikker på hvornår jeg næste gang render ind i forkert afrunding....

Mvh
Chrisser



Tomasz Otap (29-04-2005)
Kommentar
Fra : Tomasz Otap


Dato : 29-04-05 08:03

Chrisser wrote:
> Mine tal er i kroner & ører - altså 2 decimaler og det skal give
præcist
> 0,00 ( det kan godt være jeg ikke fik pointeret dette i mit første indlæg )
> og såvidt jeg kan se, kan jeg jo så desværre ikke bruge math.round ( det
> ville være noget andet hvis jeg kunne angive antal decimaler ).

Det kan du; prøv den her lille formel:

res1 = Math.round(res1*100)/100;

Ved at multiplicere det oprindelige resultat med 100, afrunde og
derefter dividere resultatet med 100 burde du få et nydelig tal med to
decimaler. Du kan erstatte 100 med 10^x, hvor x er det antal decimaler,
du ønsker i tallet.

t

Chrisser (29-04-2005)
Kommentar
Fra : Chrisser


Dato : 29-04-05 08:36

Tomasz Otap wrote:
> res1 = Math.round(res1*100)/100;
>
> Ved at multiplicere det oprindelige resultat med 100, afrunde og
> derefter dividere resultatet med 100 burde du få et nydelig tal med
> to decimaler. Du kan erstatte 100 med 10^x, hvor x er det antal
> decimaler, du ønsker i tallet.

logik for perlehøns - jeg har vist ladet mig hyle helt ud af den

Chrisser



Lasse Reichstein Nie~ (29-04-2005)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 29-04-05 16:38

Tomasz Otap <tomasz@otap.justRemoveThis.dk> writes:

> Chrisser wrote:
>> Mine tal er i kroner & ører - altså 2 decimaler og det skal give
>> præcist
>> 0,00 ( det kan godt være jeg ikke fik pointeret dette i mit første
>> indlæg ) og såvidt jeg kan se, kan jeg jo så desværre ikke bruge
>> math.round ( det ville være noget andet hvis jeg kunne angive antal
>> decimaler ).
>
> Det kan du; prøv den her lille formel:
>
> res1 = Math.round(res1*100)/100;

Den ser *ud* til at virke, fordi de resulterende tal bliver skrevet ud
rigtigt. Det ændrer dog ikke ved at 0.3 ikke kan repræsenteres eksakt
binært.

Hvis man skal regne med penge, så kan det anbefales altid at regne i
ører (eller cent eller hvad den mindste enhed i det pågældende
pengesystem hedder). Så kan man altid sætte et decimalkomma ind før
man skriver ud, men alle beregninger bliver heltals-operationer.

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Søg
Reklame
Statistik
Spørgsmål : 177495
Tips : 31968
Nyheder : 719565
Indlæg : 6408489
Brugere : 218886

Månedens bedste
Årets bedste
Sidste års bedste