Number, punto flotante y Math en JavaScript | Nicolás Garzón
El tipo number representa enteros y decimales mediante punto flotante binario de doble precisión.
JavaScript
Copiar typeof 10 ;
typeof 10.5 ; La representación utiliza signo, exponente y fracción. Muchos decimales comunes no tienen representación binaria exacta.
JavaScript
Copiar 0.1 + 0.2 ; No es un error exclusivo de JavaScript; es una consecuencia del formato binario.
JavaScript
Copiar function areClose ( first, second, tolerance ) {
return Math. abs ( first - second) <= tolerance;
} La tolerancia debe depender de la escala y el dominio. Number.EPSILON no es una solución universal para números grandes.
JavaScript
Copiar Number. MAX_SAFE_INTEGER ;
Number. MIN_SAFE_INTEGER ;
Number. isSafeInteger ( value) ; Fuera de ±(2^53 - 1), enteros distintos pueden representar el mismo Number.
JavaScript
Copiar Number. MAX_SAFE_INTEGER + 1 ===
Number. MAX_SAFE_INTEGER + 2 ;
Usa BigInt o strings cuando necesitas enteros exactos mayores.
JavaScript
Copiar Number ( "hello" ) ; JavaScript
Copiar typeof NaN ;
NaN === NaN ; JavaScript
Copiar Number. isNaN ( value) ; El global isNaN primero coerciona y puede producir resultados sorprendentes.
JavaScript
Copiar 1 / 0 ;
- 1 / 0 ; JavaScript
Copiar Number. isFinite ( value) ; JavaScript
Copiar 0 === - 0 ;
Object. is ( 0 , - 0 ) ; Puede aparecer en cálculos y afectar operaciones como división.
JavaScript
Copiar 1 / 0 ;
1 / - 0 ; JavaScript
Copiar Number ( "42" ) ;
Number. parseInt ( "42px" , 10 ) ;
Number. parseFloat ( "3.14rem" ) ; Number exige convertir el string completo; parseInt y parseFloat pueden detenerse al encontrar contenido inválido.
JavaScript
Copiar Math. round ( 2.5 ) ;
Math. floor ( 2.9 ) ;
Math. ceil ( 2.1 ) ;
Math. trunc ( - 2.9 ) ; Con negativos, floor va hacia menos infinito y trunc hacia cero.
JavaScript
Copiar const text = ( 10.5 ) . toFixed ( 2 ) ;
Retorna string para presentación. No debe confundirse con una estrategia de precisión interna.
No uses punto flotante ingenuo para sumar unidades monetarias cuando se requiere exactitud contable.
JavaScript
Copiar const totalCents = 1099 + 250 ; Representar unidades menores como enteros puede funcionar si los valores permanecen dentro del rango seguro y la moneda tiene escala conocida. Sistemas financieros pueden necesitar decimal libraries o backend especializado.
JavaScript
Copiar Math. abs ( value) ;
Math. min ( ... values) ;
Math. max ( ... values) ;
Math. sqrt ( value) ;
Math. pow ( base, exponent) ;
Math. random ( ) ; Math trabaja con Number, no con BigInt.
JavaScript
Copiar Math. random ( ) ; Es útil para simulación y UI no sensible. Para tokens o secretos utiliza una API criptográfica del entorno como crypto.getRandomValues.
JavaScript
Copiar Math. sumPrecise ( values) ; Las ediciones modernas incorporan una suma que reduce pérdida de precisión causada por magnitudes distintas. No convierte Number en decimal exacto ni soluciona todos los dominios financieros.
JavaScript
Copiar 0b1010 ;
0o12 ;
0x0a ; JavaScript
Copiar number. toString ( 16 ) ;
Number. parseInt ( "ff" , 16 ) ; JavaScript
Copiar const million = 1_000_000 ; Mejoran lectura y no cambian el valor.
JavaScript
Copiar const formatter = new Intl. NumberFormat ( "es-CO" , {
style : "currency" ,
currency : "COP" ,
} ) ;
formatter. format ( 150000 ) ; La presentación debe separarse del cálculo.
JavaScript
Copiar function createPercentage ( value ) {
if ( ! Number. isFinite ( value) ) {
throw new TypeError ( "Percentage must be finite" ) ;
}
if ( value < 0 || value > 100 ) {
throw new RangeError (
"Percentage must be between 0 and 100" ,
) ;
}
return value;
}
Esperar decimales binarios exactos.
Usar Number.isNaN y global isNaN como equivalentes.
Ignorar Infinity.
Guardar IDs enormes en Number.
Creer que toFixed retorna number.
Usar Math.random para seguridad.
Comparar decimales siempre con ===.
Formatear antes de terminar cálculos.
Number usa punto flotante binario de 64 bits.
Los decimales pueden ser aproximados.
Solo ciertos enteros son seguros.
NaN e Infinity pertenecen al tipo number.
Number.isFinite y Number.isNaN no coercionan.
Math trabaja con Number.
La presentación pertenece a Intl.NumberFormat.
Dinero necesita una estrategia explícita de precisión.
¿Por qué guardar un ID de 20 dígitos en Number puede cambiarlo?
Respuesta Porque supera la precisión entera segura de 53 bits y distintos enteros pueden redondearse a la misma representación.
BigInt cubre enteros de precisión arbitraria y sus límites.