Javascript - Multiplikation blir fel, förväntar mig 0.6 men blir 0.6000000000000001

Permalänk
Medlem

Javascript - Multiplikation blir fel, förväntar mig 0.6 men blir 0.6000000000000001

Hej
Jag håller på med ett dokument i acrobat 9 som nyttjar javascript.
Jag ska gör en enkel sak, jag ska multiplicera ihop 2 fält och lägga resultatet i ett annat.
Hittils är allt okej, men själva multiplikationen ger mig ett konstigt resultat.

Samma resultat får jag om jag testar att multiplicera i ett HTML-dokument
Här är koden jag testat:

<script type="text/javascript"> document.write(0.2*4 + "<br>"); //förväntas bli 0.8 blir 0.8 //fungerar document.write(0.2*3 + "<br>"); //förväntas bli 0.6 blir 0.6000000000000001 //fungerar inte </script>

Hur i hela friden kan 0.2 * 3 bli 0.6000000000000001
Vad kommer den där 1:an ifrån!?!?

Nån som vet varför det blir fel, eller har jag hittat en bugg i javascriptmotorn?

Jag kan ju iaf lösa det så länge med att köra:
var num=0.550000000001;
document.write(num.toFixed(2));

/Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem

Du använder flyttal, och flyttal kan inte representera vissa tal korrekt.

0.1 går t.ex. inte att representera i ett 32-bits flyttal. Men det är ändå relativt korrekt, du kan göra som du gör där, och klippa bort resterande decimaler. Det andra du kan göra är att räkna decimalt istället. Tänk att du räknar i ören istället för kronor. 1 kr blir då 100 öre, du får helt enkelt konvertera fram och tillbaka.

Alt. kan du använda ett lib för exakt representering av tal, men jag känner inte till några sådana för javascript.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem

Det är ingen bugg, det har att göra med hur decimaltal är representerrade i datorn.
Man kan inte representera alla tal exakt, ta 10/3 som exempel, i bas 10 blir det 0.333333333, och som du säkert vet är ju alla tal i datorn i bas 2, och där är det andra tal som inte kan visas exakt.
Som exempel:
1/10 kan ju enkelt skrivas som 0.1 i bas 10, men i bas 2 går det inte att representera exakt, så datorn kommer att spara
0.100000001490116119384765625 (decimalutvecklingen blir oädnlig som i 10/3 i bas 10, men datorn har ju inte oändligt med minne)