¿Por qué el tipo de este código JavaScript siempre es una ‘Cadena’ a pesar de que estoy ingresando un número en el campo de entrada?

Como se puede leer aquí: HTMLInputElement

value : (string) Devuelve / Establece el valor actual del control.

El atributo de valor del Elemento de entrada en HTML es de tipo String .

Por lo tanto, el valor se analiza como una cadena.

Curiosamente

type: (string) Devuelve / Establece el atributo type del elemento, indicando el tipo de control a mostrar. Consulte el atributo de tipo para conocer los posibles valores.

Tenga en cuenta que el atributo type solo altera el “tipo de control a mostrar”.

Cuando el tipo se establece en “número”, solo se permite ingresar números. Pero el valor todavía se almacena como una cadena. Y por lo tanto, el atributo de valor del elemento de entrada aún devuelve un tipo de datos de cadena.

Como estudio adicional, vea el comportamiento de la “casilla de verificación”. Cuando el atributo de tipo se establece en “casilla de verificación”, ¿espera que el valor sea booleano! En este caso, el valor es una de las dos cadenas: “verdadero”, “falso”.

Desde una perspectiva de diseño (del campo de entrada), esto es una buena idea porque siempre puede esperar una Cadena del atributo de valor en lugar de complicar las cosas haciéndola dependiente del atributo de tipo.

Debido a que es la propiedad de value un elemento de input (y dado que solo recuperó este valor una vez, conserva el valor inicial: la cadena vacía.
Si desea verificar si es un número, puede intentar esto:

function isNumber() {
var val = document.getElementById("disc_perc1").value;
var num = +value;
if (num == num) {
alert("It is a number!");
} else {
alert("Uh, oh");
}
}

El valor de una entrada de texto siempre será una cadena. Prueba parseFloat (discPerc1).