javascript - tag - title of page html
Tratando con la precisiĆ³n del flotador en Javascript (5)
Al abordar esta tarea, primero encontraré el número de decimales en x
, luego redondearé y
consecuencia. Yo usaría:
y.toFixed(x.toString().split(".")[1].length);
Debería convertir x
en una cadena, dividirla sobre el punto decimal, encontrar la longitud de la parte derecha y, a continuación, y.toFixed(length)
debería redondearse y
función de esa longitud.
Esta pregunta ya tiene una respuesta aquí:
Tengo una gran cantidad de valores numéricos y
en javascript. Quiero agruparlos redondeándolos al múltiplo x
más cercano y convertir el resultado en una cadena.
¿Cómo puedo evitar la molesta precisión del punto flotante?
Por ejemplo:
0.2 + 0.4 = 0.6000000000000001
Dos cosas que he intentado:
>>> y = 1.23456789
>>> x = 0.2
>>> parseInt(Math.round(Math.floor(y/x))) * x;
1.2000000000000002
y:
>>> y = 1.23456789
>>> x = 0.2
>>> y - (y % x)
1.2000000000000002
De esta publicación: ¿Cómo lidiar con la precisión del número de coma flotante en JavaScript?
Tienes pocas opciones:
- Use un tipo de datos especial para decimales, como decimal.js
- Formatee su resultado en un número fijo de dígitos significativos, como este:
(Math.floor(y/x) * x).toFixed(2)
- Convierte todos tus números en enteros
Mira este enlace ... Me ayudó mucho
http://www.w3schools.com/jsref/jsref_toprecision.asp
la función toPrecision (no_of_digits_required) devuelve una cadena, así que no falsifique para usar la función parseFloat () para convertir a punto decimal de precisión req
Podrías hacer algo como esto:
> +(Math.round(y/x)*x).toFixed(15);
1.2
> var x = 0.1
> var y = 0.2
> var cf = 10
> x * y
0.020000000000000004
> (x * cf) * (y * cf) / (cf * cf)
0.02
Solución rápida:
var _cf = (function() {
function _shift(x) {
var parts = x.toString().split(''.'');
return (parts.length < 2) ? 1 : Math.pow(10, parts[1].length);
}
return function() {
return Array.prototype.reduce.call(arguments, function (prev, next) { return prev === undefined || next === undefined ? undefined : Math.max(prev, _shift (next)); }, -Infinity);
};
})();
Math.a = function () {
var f = _cf.apply(null, arguments); if(f === undefined) return undefined;
function cb(x, y, i, o) { return x + f * y; }
return Array.prototype.reduce.call(arguments, cb, 0) / f;
};
Math.s = function (l,r) { var f = _cf(l,r); return (l * f - r * f) / f; };
Math.m = function () {
var f = _cf.apply(null, arguments);
function cb(x, y, i, o) { return (x*f) * (y*f) / (f * f); }
return Array.prototype.reduce.call(arguments, cb, 1);
};
Math.d = function (l,r) { var f = _cf(l,r); return (l * f) / (r * f); };
> Math.m(0.1, 0.2)
0.02
Puede consultar la explicación completa aquí .