Función que devuelve un lugar decimal arbitrario en javascript

Quiero hacer alguna función en javascript, que reciba algún número y número de posición n y devuelve su nth lugar decimal.

Es decir,

nthdigit(3.5852,2) = 8
nthdigit(3.5852,3) = 5
nthdigit(3.5852,5) = 0
nthdigit(9.772,1) = 7

¿Cómo puedo hacer esto correctamente? Gracias.

preguntado el 08 de febrero de 14 a las 12:02

¿Has probado algo? -

@Tobias: solo se puede aceptar una sola respuesta (y OP aún no puede votar), pero está bien esperar unos días antes de elegir la mejor respuesta. ¡No puede esperar que acepte después de 10 minutos! -

@Bergi: Por supuesto, no esperaba ninguna respuesta a esta pregunta por el momento. Eché un vistazo a su perfil; no se aceptaron respuestas. Por eso le pedí que empezara a hacerlo en general. Por cierto, la solución matemática pura proporcionada aquí es hermosa y merece ser aceptada. -

@Bergi He intentado usar parseInt() antes, pero no funcionó, porque parseInt((5.3-5)*10) fue parseInt(3.0000001)=3 pero parseInt((5.2-5)*10) se convirtió en parseInt(1.99999)=1, devolviendo respuestas incorrectas. Con suerte, encontré una gran solución aquí. -

4 Respuestas

Solución matemática pura:

function decimaldigit(num, n) {
return Math.floor(num * Math.pow(10, n)) % 10;
}

Respondido 08 Feb 14, 12:02

¡Siempre me siento tonto cuando a alguien se le ocurre una solución matemática pura y yo estaba sugiriendo operaciones con cadenas! ¡Excelente! - marcusthoemmes

@Merguez: No es una tontería, ya que la solución matemática pura estará sujeta a problemas de punto flotante. Dependiendo de qué precisión se espera, las cadenas pueden ser más fáciles. - Iceberg

@Bergi Si incluso pensara en la solución matemática y luego la tirara debido a los problemas que señaló, me alegraría: D. - marcusthoemmes

Convierta el número en una cadena, divídalo en el decimal ., tome el carácter que desee y vuelva a convertirlo en un número.

function nthdigit(number, i) {
    var afterDecimal = number.toString().split(".")[1];
    return parseInt(afterDecimal.charAt(i-1));
}

He elegido charAt(i-1) porque los personajes se cuentan comenzando 0 y se siente más natural en este caso cuando quieres poner el primer número 1.

Respondido 08 Feb 14, 12:02

Esto debería ser muy fácil de resolver:

var nthdigit function(decimal, n)
{
    var dec = '' + decimal;                     //convert to string
    var decimalString = dec.split('.')[1];      //covert to array, take element with index [1]
    var decimalPlaces = decimalSting.split(''); //covert to array

    return parseInt(decimalPlaces( n-1 ));      //1. decimalPlace has index 0
}

Respondido 08 Feb 14, 12:02

Otra solución matemática pura, con mejor precisión para números altos y manejo correcto de números negativos:

function nthdigit(num, n) {
    return n ? nthdigit((num % 1) * 10, n-1) : Math.trunc(num);
}

usar Matemáticas.trunc:

if (typeof Math.trunc != "function")
    Math.trunc = function trunc(value) {
        return value === 0 ? value : !isFinite(value) ? value : value | 0;
    }

Respondido 08 Feb 14, 13:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.