2010-09-06 3 views
11

Wenn ich diese kleine Funktion:Warum die Summe von 2 parseFloat Variablen gibt mir eine falsche Dezimalzahl

<script type="text/javascript"> 

function printFloat(){ 
     var myFloatNumber1 = document.getElementById('floatNumber1'); 
     var myFloatNumber2 = document.getElementById('floatNumber2'); 
     alert(parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value)) 
} 

</script> 

<input type="text" id="floatNumber1"></input> 
<input type="text" id="floatNumber2"></input> 

<input type="button" onclick="printFloat()"/> 

in Feld 1 I eingeben: 221,58 in Feld 2 I eingeben: 2497,74

Ich erwarte, dass die Summe von 2 Zahlen in den Eingabefeldern eine 2-stellige Zahl ist: 2719.32 Aber das Ergebnis ist eine falsche Zahl ...: 2719.31999999999997

eine Runde würde die Arbeit machen, aber ich bekomme es einfach nicht warum tut der Code das auf dieser Zahl? r ... Auf anderen Zahlenkombinationen ist die Summe richtig ...

Antwort

17

Von The Floating-Point-Guide:

Warum addieren sich meine Zahlen, wie 0,1 + 0,2 nicht zu einer netten Runde 0,3, und stattdessen bekomme ich ein seltsames Ergebnis wie 0.30000000000000004?

Da intern, Computer verwenden, um ein Format (binär Gleitpunktzahlen) dass nicht genau eine Reihe wie 0,1, 0,2 oder 0,3 haupt darstellen.

Wenn der Code kompiliert wird oder interpretiert, Ihr „0,1“ ist bereits gerundet auf die nächste Zahl in diesem -Format, das auch in einer kleinen Rundungsfehler führt, bevor die Berechnung geschieht.

In Ihrem Fall treten die Rundungsfehler auf, wenn die eingegebenen Werte durch parseFloat() konvertiert werden.

Warum funktionieren andere Berechnungen wie 0,1 + 0,4 korrekt?

In diesem Fall wird das Ergebnis (0.5) kann darzustellenden genau als Gleitkommazahl, und es ist möglich, Fehler in den Eingangsnummern Rundungs ​​einander auszulöschen - aber das kann‘ t notwendigerweise darauf verlassen (beispielsweise, wenn diese beiden Zahlen wurden anders gespeichert in sized floating Punktdarstellungen zunächst werden die Rundungsfehler nicht gegen anderen Offset könnte).

In anderen Fällen wie 0,1 + 0,3, das Ergebnis eigentlich nicht wirklich 0,4 ist, aber nahe genug, dass 0,4 ist die kürzeste Zahl, die näher an dem Ergebnis ist als an jedem anderen Gleitkommazahl Nummer.Viele Sprachen zeigen dann diese Zahl an, anstatt das tatsächliche Ergebnis zurück in den nächsten Dezimalbruch zu konvertieren.

4

folgen einfach.

function printFloat(){ 
     var myFloatNumber1 = document.getElementById('floatNumber1'); 
     var myFloatNumber2 = document.getElementById('floatNumber2'); 
     var total=parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value); 
     alert(total.toFixed(2)); 
}  
Verwandte Themen