toFixed Problem

Ich glaube eher nicht, dass das ein Bug ist, denn Google Chrome, Opera und Firefox zeigen alle das gleiche Verhalten.
 
Zuletzt bearbeitet:
Wollte jetzt gerade auf deinen ersten Beitrag antworten, aber da warst du schneller mit dem ändern :)
Wenn es kein Bug ist, was ist es dann?
 
Ich würde jetzt einfach mal vermuten das es daran liegt das Floats nie exakt sind da sie Binär nie exakt dargestellt werden können. D.h. die Zahl ist nie genau die Zahl die du erwartest sondern immer nur nah dran. Entweder also etwas größer oder etwas kleiner und jenachdem entsteht dann eben dieser Rundungsfehler. Der eigentlich kein Fehler ist.
 
Hm hier mal schnell eine Überprüfung zusammen gekritzelt. Ich geb dir aber keine Garantie das sie Fehlerfrei ist.
Javascript:
function toFixedCheck(num,numFixed,x){
    num = num.toString();
    numFixed = numFixed.toString();
    var sep = num.indexOf('.');
    var sep2 = numFixed.indexOf('.');
    if(num[sep+x] == numFixed[sep2+x]){
        if(num[sep+x+1] >= 5){
            numFixed = (parseInt(numFixed.replace('.',''))+1).toString();            
            numFixed = numFixed.substring(0,sep2) + '.' + numFixed.substr(sep2,numFixed.length-sep2);
        }
    }
    return parseFloat(numFixed);
}
 
Ich hab mal auf die schnelle eine Ersatz-Methode geschrieben. Keine Garantie, dass sie auch in allen Fällen korrekt arbeitet oder das alle Sonderfälle abgedeckt sind. Ich gehe aber mal davon aus, dass irgendwo bereits eine solche, bessere Methode existiert.

Javascript:
Number.prototype.toFixedFixed = function(fractionDigits) {
	var x = this;

	if(fractionDigits == 'undefined' || typeof(fractionDigits) != 'number')
		return '';

	if(x == NaN)
		return 'NaN';

	if(fractionDigits < 0 || fractionDigits > 20)
		throw new RangeError();

	var sign = '';

	if(x < 0) {
		sign = '-';
		x = -x;
	}

	var pow10 = 1, i=fractionDigits;

	while(i--) pow10 *= 10;

	var rounded = (x*pow10 + 0.5) | 0;

	rounded = rounded.toString();

	if(fractionDigits === 0)
		return sign + rounded.substr(0, 1);

	return sign + rounded.substr(0, rounded.length - fractionDigits) + '.' + rounded.substr(rounded.length - fractionDigits, rounded.length);
};
 
Zurück