Imagina que construyes el carrito de compras de una tienda online. Sumas los precios, aplicas descuentos, calculas impuestos y muestras el total final. Todo parece estar bien hasta que un usuario añade tres artículos a 19.99 cada uno y el subtotal aparece como 59.96999999999999 en lugar de 59.97. ¿Qué pasó? Bienvenido al mundo de los números en JavaScript. A simple vista parecen solo dígitos y un punto decimal, pero bajo esa sencillez hay un sistema potente y a veces caprichoso que todo desarrollador debe comprender para crear aplicaciones precisas y robustas.
Tipo Number en JavaScript: qué es y por qué importa. A diferencia de lenguajes como Java o C++ que tienen int, float, double o long, JavaScript maneja un solo tipo numérico principal: el formato de coma flotante binaria de doble precisión de 64 bits definido por la norma IEEE 754. En la práctica, cualquier número que uses en JS, ya sea 42, -3.14 o 6.022e23, se representa internamente con ese mismo formato. Esta simplificación facilita el aprendizaje pero exige entender sus limitaciones para evitar errores comunes.
Crear números: literales y constructor. La forma recomendada es usar literales, por ejemplo span>let entero = 42; span>let precio = 19.99; span>let negativo = -100; span>let exponente = 1.5e6; También existen literales hex, binarios y octales como 0x2F, 0b1010 y 0o744. Por otro lado la función Number se usa principalmente para convertir otros tipos a número, por ejemplo span>let desdeCadena = Number(123); pero evita usar new Number(valor) porque crea un objeto Number y no un primitivo, lo que puede provocar comportamientos inesperados.
Precisión de coma flotante: el problema central. JavaScript usa aritmética binaria en coma flotante, por lo que no puede representar exactamente todas las fracciones decimales, igual que en base decimal no podemos representar exactamente 1 dividido por 3. Esto provoca resultados como span>0.1 + 0.2 // 0.30000000000000004 y la comparación span>0.1 + 0.2 === 0.3 da false. No es un bug de JS sino una consecuencia del estándar IEEE 754 y ocurre en muchos lenguajes.
Cómo manejar los problemas de precisión: soluciones prácticas. Para comparaciones evita la igualdad estricta y usa una tolerancia o epsilon. Number.EPSILON representa la mínima diferencia entre 1 y el siguiente número representable mayor que 1 y es útil para definir esa tolerancia. Por ejemplo, crear una función de comparación aproximada ayuda a decidir si dos valores son suficientemente cercanos.
Para mostrar números al usuario usa formato fijo con toFixed y convierte cuando necesites el número real. Por ejemplo si subtotal = 19.99 * 3 probablemente obtengas 59.96999999999999 y subtotal.toFixed(2) devuelve la cadena 59.97. Para cálculos financieros serios la mejor práctica es evitar completamente los decimales de coma flotante y operar en la unidad mínima de la moneda, por ejemplo en centavos: representa 10.99 como 1099 y realiza todas las operaciones con enteros para garantizar precisión absoluta.
Valores especiales: NaN, Infinity y -Infinity. NaN aparece cuando una operación matemática falla y curiosamente NaN no es igual a sí mismo, por eso siempre conviene usar Number.isNaN para detectarlo con fiabilidad. Infinity y -Infinity representan desbordamientos numéricos cuando se exceden los límites representables y Number.isFinite ayuda a detectarlos.
Objeto global Math: tu caja de herramientas. Math ofrece constantes como Math.PI y métodos útiles para redondeo y operaciones: Math.round, Math.floor, Math.ceil, Math.trunc, Math.random, Math.max, Math.min, Math.pow y Math.sqrt, además del operador ** para potencias modernas.
BigInt: enteros arbitrariamente grandes. Hasta ES2020 JavaScript no representaba de forma segura enteros mayores que 2^53 - 1. BigInt solucionó esto permitiendo enteros de longitud arbitraria. Se crea añadiendo una n al final del literal, por ejemplo 9007199254740991n, o usando BigInt( cadena ). Importante: no se pueden mezclar Number y BigInt en una operación sin conversión explícita, y BigInt no admite decimales ni métodos de Math.
Ejemplos prácticos en el mundo real. Cálculo de carrito usando centavos: sumar precios convertidos a centavos evita errores. Validación de entrada: convertir con Number y comprobar Number.isNaN para indicar al usuario que ingrese un número válido. Generación de enteros aleatorios en un rango: usar Math.random junto con Math.floor para obtener valores enteros entre min y max.
Buenas prácticas resumidas: usa literales en lugar de new Number, comprende que 0.1 + 0.2 no es exactamente 0.3, compara con tolerancia usando Number.EPSILON, formatea para visualización con toFixed, realiza cálculos financieros en enteros de la unidad mínima, usa Number.isNaN para comprobaciones y emplea BigInt para enteros por encima de Number.MAX_SAFE_INTEGER.
Preguntas frecuentes rápidas. Por qué typeof NaN devuelve number: porque NaN es un valor del tipo numérico que indica un resultado indefinido o no representable. Cuál es el número máximo: Number.MAX_VALUE, aproximadamente 1.8e308; valores mayores se convierten en Infinity. Diferencia entre Number y parseInt: Number intenta convertir toda la cadena a número mientras parseInt analiza hasta encontrar un carácter no numérico y retorna lo parseado, y siempre es bueno especificar la base al usar parseInt.
Casos de uso empresariales y servicios. En Q2BSTUDIO como empresa de desarrollo de software y aplicaciones a medida diseñamos soluciones que tienen en cuenta todas estas consideraciones para garantizar precisión y escalabilidad. Ofrecemos servicios de desarrollo de software a medida y aplicaciones a medida, integración con plataformas cloud y arquitectura confiable, además de soluciones de inteligencia artificial para empresas, agentes IA y automatización inteligente. También cubrimos ciberseguridad, pentesting, servicios cloud aws y azure, servicios inteligencia de negocio y despliegues con Power BI.
Si tu proyecto requiere cálculos financieros precisos, generación de identificadores a gran escala o análisis con inteligencia de negocio, en Q2BSTUDIO podemos asesorar y desarrollar la solución adecuada, combinando experiencia en software a medida, arquitecturas cloud y prácticas de ciberseguridad para proteger tus datos.
Conclusión. El tipo numérico único de JavaScript simplifica el lenguaje pero exige entender la aritmética en coma flotante y sus límites. Con técnicas como comparaciones con epsilon, uso de enteros para dinero, formateo para visualización y BigInt para enteros grandes puedes evitar la mayoría de errores y construir aplicaciones robustas. Si quieres elevar tu proyecto con desarrollo a medida, servicios cloud, inteligencia artificial o seguridad, contacta con Q2BSTUDIO para una solución profesional y escalable.