La implementación predeterminada de "Número.aFija" de javascript parece estar un poco rota.roto en Implementación ajustada
console.log((8.555).toFixed(2)); // returns 8.56
console.log((8.565).toFixed(2)); // returns 8.57
console.log((8.575).toFixed(2)); // returns 8.57
console.log((8.585).toFixed(2)); // returns 8.59
Necesito un método de redondeo que sea más consistente que eso.
En el rango entre 8.500 y 8.660, los siguientes números no se redondean correctamente.
8.575
8.635
8.645
8.655
He tratado de arreglar la implementación del prototipo de la siguiente manera, pero está solo a medio camino. ¿Alguien puede sugerir algún cambio que lo haga funcionar de manera más consistente?
Number.prototype.toFixed = function(decimalPlaces) {
var factor = Math.pow(10, decimalPlaces || 0);
var v = (Math.round(this * factor)/factor).toString();
if (v.indexOf('.') >= 0) {
return v + factor.toString().substr(v.length - v.indexOf('.'));
}
return v + '.' + factor.toString().substr(1);
};
Me imagino que este es un error de precisión de punto flotante. –
[http://stackoverflow.com/questions/566564/javascript-functions-math-round0-vs-tofixed0-and-browser-inconsistencies](http://stackoverflow.com/questions/566564/javascript-functions-math -round0-vs-tofixed0-and-browser-inconsistencies) similar? – Prescott
Acabo de probar los ejemplos anteriores en Chromium V12.0 y recibí los siguientes resultados: 8.55 8.56 8.57 8.59. Por lo tanto, su millaje puede variar según su implementación de JavaScript. – HBP