kkapsner
Super Moderator
Natürlich ist .toFixed korrekt.
Das Problem ist, dass man die Zahlen, die scheinbar falsch gerundet werden, nicht in binären Fließkommanzahlen darstellbar sind:
diese gespeicherte Zahl wird dann richtig gerundet.
Nun gibt es aber auch Zahlen, die mit der neuen Funktion vom schlauen falsch gerundet werden:
.
Da aber 0.5 in binären Fließkommazahlen darstellbar ist (0.1b) hat man da viel weniger Probleme, wenn man mit Ganzzahlen (also in Cent) arbeitet.
Ich würde dieses "Verteilungsproblem" ja so lösen (wenn man unbedingt Strings als Parameter übergeben können muss):
Das Problem ist, dass man die Zahlen, die scheinbar falsch gerundet werden, nicht in binären Fließkommanzahlen darstellbar sind:
Code:
alert(4.935.toFixed(20))
Nun gibt es aber auch Zahlen, die mit der neuen Funktion vom schlauen falsch gerundet werden:
Code:
4.9349999999999999.fix(2) // sollte eigentlich 4.93 sein
Da aber 0.5 in binären Fließkommazahlen darstellbar ist (0.1b) hat man da viel weniger Probleme, wenn man mit Ganzzahlen (also in Cent) arbeitet.
Ich würde dieses "Verteilungsproblem" ja so lösen (wenn man unbedingt Strings als Parameter übergeben können muss):
Code:
function splitProfit(value, parts){
if (typeof value === "string"){
value = Math.round(parseFloat((value + "00").replace(/(.|,)(\d\d)/, "$2.")));
}
var remaining = value;
var ret = [];
for (var i = 0; i < parts.length; i++){
if (typeof parts[i] === "string"){
parts[i] = parseFloat(parts[i].replace(",", ".")) / 100;
}
var part = Math.round(value * parts[i]);
remaining -= part;
ret.push(part);
}
ret.push(remaining);
return ret;
}
alert(splitProfit("24,37", [0.115, "11,5"]));
Zuletzt bearbeitet: