01 · Punto de partida
Reducir cifras también es una decisión algorítmica
Un cálculo puede producir más cifras de las que necesitamos, podemos almacenar o podemos justificar. Para reducirlas existen dos operaciones frecuentes: truncar y redondear.
Si partimos de 12.9876 y conservamos dos posiciones decimales:
Truncamiento
12.98
Descarta todas las cifras posteriores sin utilizar su valor.
Redondeo al más cercano
12.99
Elige el valor de dos decimales más próximo al original.
Ambas operaciones introducen error, pero no se comportan igual. El truncamiento tiende sistemáticamente hacia cero. El redondeo al más cercano suele producir un error menor, aunque necesita una regla para resolver empates.
02 · Descartar cifras
Truncamiento
Truncar consiste en eliminar todas las cifras ubicadas después de una posición determinada, sin observar la primera cifra descartada.
| Valor original | Valor truncado | Error con signo |
|---|---|---|
| 7.128 | 7.12 | −0.008 |
| 7.129 | 7.12 | −0.009 |
| −7.128 | −7.12 | +0.008 |
| 0.0049 | 0.00 | −0.0049 |
Truncar hacia una cantidad fija de decimales equivale a desplazarlos, aplicar una operación hacia cero y restaurar la escala:
function truncarDecimales(valor, decimales) {
const factor = 10 ** decimales;
return Math.trunc(valor * factor) / factor;
}
console.log(truncarDecimales(12.9876, 2)); // 12.98
console.log(truncarDecimales(-12.9876, 2)); // -12.98
Math.trunc elimina la parte fraccionaria y se dirige hacia cero. No debe confundirse con Math.floor, que siempre se dirige hacia menos infinito.
03 · Elegir el valor más cercano
Redondeo
Para redondear al valor más cercano observamos la primera cifra descartada. En la regla decimal escolar:
- si es menor que 5, la última cifra conservada no cambia;
- si es mayor que 5, la última cifra conservada aumenta una unidad;
- si es exactamente 5 y no hay más información, necesitamos una regla de desempate.
| Valor original | Resultado | Motivo |
|---|---|---|
| 7.123 | 7.12 | La cifra siguiente es 3 |
| 7.126 | 7.13 | La cifra siguiente es 6 |
| 7.125 | Depende de la regla | Existe un empate decimal |
| 99.999 | 100.00 | El acarreo cambia la parte entera |
Con redondeo al más cercano y paso u entre valores permitidos, el error absoluto máximo ideal es la mitad del paso:
Al conservar dos decimales, u = 0.01, por lo que el error de redondeo ideal no supera 0.005.
04 · Reglas diferentes
Modos de redondeo
“Redondear” no describe una única operación. Los sistemas numéricos y financieros utilizan distintas reglas según el objetivo.
| Modo | 2.5 | −2.5 | Descripción |
|---|---|---|---|
| Hacia cero | 2 | −2 | Descarta la fracción |
| Hacia +∞ | 3 | −2 | Menor entero que no es inferior |
| Hacia −∞ | 2 | −3 | Mayor entero que no es superior |
Empates hacia +∞ de Math.round | 3 | −2 | Los empates avanzan hacia el valor positivo |
| Empates al par | 2 | −2 | Elige el vecino cuya última cifra es par |
| Empates lejos de cero | 3 | −3 | Regla escolar frecuente |
const valores = [2.5, -2.5];
for (const valor of valores) {
console.log({
valor,
trunc: Math.trunc(valor),
floor: Math.floor(valor),
ceil: Math.ceil(valor),
round: Math.round(valor)
});
}
05 · Reducir el sesgo
Redondeo de empates al par
Si todos los valores terminados exactamente en 5 se redondean siempre en la misma dirección, una colección grande puede adquirir un pequeño sesgo sistemático. El redondeo de empates al par —también llamado redondeo bancario— alterna el sentido según la paridad de la cifra conservada.
Así, aproximadamente la mitad de los empates sube y la otra mitad baja.
function redondearEnteroAlPar(valor) {
const inferior = Math.floor(valor);
const fraccion = valor - inferior;
if (fraccion < 0.5) return inferior;
if (fraccion > 0.5) return inferior + 1;
return inferior % 2 === 0 ? inferior : inferior + 1;
}
console.log([2.5, 3.5, 4.5, 5.5].map(redondearEnteroAlPar));
console.log([-2.5, -3.5].map(redondearEnteroAlPar));
El formato binario IEEE 754 utiliza normalmente empates al par para las operaciones básicas de punto flotante. Eso no obliga a que las funciones decimales de cada lenguaje presenten los valores con la misma política.
06 · Escala decimal fija
Posiciones decimales
Conservar d posiciones decimales significa fijar cuántas cifras aparecen a la derecha del separador decimal, independientemente del tamaño del número.
| Original | Dos decimales | Cifras significativas visibles |
|---|---|---|
| 1234.567 | 1234.57 | 6 |
| 12.34567 | 12.35 | 4 |
| 0.1234567 | 0.12 | 2 |
| 0.001234 | 0.00 | Ninguna información útil |
Una cantidad fija de decimales resulta útil para dinero, resoluciones instrumentales y formatos tabulares. No es apropiada para abarcar magnitudes muy distintas: un número pequeño puede desaparecer y uno grande conservar más cifras de las necesarias.
toFixed formatea; no cambia el número original
const valor = 12.3456;
const texto = valor.toFixed(2);
console.log(texto); // "12.35"
console.log(typeof texto); // "string"
console.log(valor); // 12.3456
07 · Información relevante
Cifras significativas
Las cifras significativas comienzan en el primer dígito distinto de cero y expresan la precisión del valor sin depender de dónde se encuentre el separador decimal.
| Valor escrito | Cantidad | Explicación |
|---|---|---|
| 0.00456 | 3 | Los ceros iniciales solo ubican el separador |
| 1.020 | 4 | Los ceros interiores y el cero final decimal son informativos |
| 7002 | 4 | Los ceros entre dígitos no nulos cuentan |
| 1500 | Ambiguo | La escritura no indica si los ceros finales fueron medidos |
| 1.50 × 10³ | 3 | La notación científica elimina la ambigüedad |
JavaScript almacena el valor numérico, no la intención de su escritura. Los literales 1.5, 1.50 y 1.5000 producen el mismo Number. Si necesitamos conservar la precisión declarada debemos guardar también metadatos o el texto original.
08 · Escala adaptable
Redondear a cifras significativas
Para conservar n cifras significativas identificamos el orden de magnitud del número y ajustamos el factor de escala.
function redondearSignificativas(valor, cifras) {
if (!Number.isFinite(valor)) return valor;
if (valor === 0) return 0;
if (!Number.isInteger(cifras) || cifras < 1) {
throw new Error("La cantidad de cifras debe ser un entero positivo");
}
const exponente = Math.floor(Math.log10(Math.abs(valor)));
const factor = 10 ** (cifras - 1 - exponente);
return Math.round(valor * factor) / factor;
}
console.log(redondearSignificativas(12345.67, 3)); // 12300
console.log(redondearSignificativas(0.001234567, 3)); // 0.00123
El valor numérico 12300 no conserva por sí mismo que decidimos utilizar tres cifras significativas. Para comunicarlo sin ambigüedad podemos mostrar 1.23 × 10⁴ o conservar un formato adecuado.
09 · Particularidades de JavaScript
Por qué desplazar decimales puede sorprender
La técnica Math.round(valor * factor) / factor opera sobre aproximaciones binarias. Algunos empates decimales no llegan internamente como un empate exacto:
console.log(Math.round(1.005 * 100) / 100);
console.log((1.005).toFixed(2));
console.log(1.005 * 100);
console.log((1.005).toPrecision(20));
Según el entorno conforme a JavaScript, el valor almacenado alrededor de 1.005 puede provocar un resultado que no coincide con la intuición decimal escolar. Sumar Number.EPSILON corrige algunos ejemplos, pero no constituye una solución universal para todas las magnitudes y signos.
10 · Cuantificar lo descartado
Error de truncamiento y de redondeo
En esta lección llamamos error de truncamiento decimal a la diferencia introducida al cortar cifras. Más adelante utilizaremos “error de truncamiento” en un sentido más amplio: reemplazar un proceso matemático infinito por una cantidad finita de términos o pasos.
Para x = 8.376 con dos decimales:
| Método | Aproximación | Error con signo | Error absoluto |
|---|---|---|---|
| Truncamiento | 8.37 | −0.006 | 0.006 |
| Redondeo | 8.38 | +0.004 | 0.004 |
En general, el redondeo al más cercano minimiza el error absoluto entre los valores disponibles. El truncamiento puede elegirse por una regla de negocio o porque necesitamos garantizar que el resultado nunca exceda cierta cantidad.
11 · Efecto sobre un algoritmo
Redondear en cada paso o solo al final
Si reducimos cifras después de cada operación, los errores ingresan nuevamente al cálculo y pueden acumularse.
Ejemplo: sumar 0.006 cien veces
function redondear2(valor) {
return Math.round(valor * 100) / 100;
}
let acumuladoConRedondeo = 0;
let acumuladoCompleto = 0;
for (let i = 0; i < 100; i++) {
acumuladoConRedondeo = redondear2(acumuladoConRedondeo + 0.006);
acumuladoCompleto += 0.006;
}
console.log(acumuladoConRedondeo); // 1
console.log(redondear2(acumuladoCompleto)); // 0.6
Al redondear cada incremento, 0.006 se comporta como 0.01. La diferencia final es considerable. La regla general es conservar la precisión interna y redondear para presentar el resultado, salvo que el problema exija redondear en etapas específicas.
12 · Tendencias sistemáticas
Sesgo de truncamiento y redondeo
Un error aleatorio puede compensarse parcialmente al promediar muchos datos. Un error con dirección preferente genera sesgo.
Truncamiento
Siempre acerca el valor a cero y puede producir una tendencia sistemática.
Al más cercano
Los errores pueden ir en ambas direcciones, aunque el desempate puede introducir sesgo.
Empates al par
Reduce el sesgo en conjuntos con numerosos empates exactos.
El modo apropiado depende del dominio. Un sistema de inventario puede necesitar truncar si no admite fracciones de unidades. Un cálculo estadístico suele preferir un redondeo con bajo sesgo. Una normativa contable puede imponer una regla determinada.
13 · Exploración interactiva
Laboratorio: redondear y truncar
Ingresá un valor, elegí la cantidad de posiciones decimales y compará ambos métodos. La recta amplía la región comprendida entre los resultados para hacer visible el error.
Información descartada
x = 12.9876 · d = 2
Para este valor, el redondeo produce el menor error absoluto.
Preguntas para explorar
- Compará un valor positivo y uno negativo. ¿En qué dirección actúa el truncamiento?
- Seleccioná “Con acarreo”. ¿Por qué cambia la parte entera?
- Reducí las posiciones del ejemplo pequeño hasta que el resultado sea cero.
- Buscá un caso en el que truncamiento y redondeo produzcan el mismo valor.
14 · Herramientas reutilizables
Separar cálculo y presentación
Una interfaz puede mostrar una cantidad redondeada sin modificar el valor que utiliza el algoritmo:
function presentarMedicion(valor, decimales, unidad) {
if (!Number.isFinite(valor)) {
throw new Error("La medición debe ser finita");
}
if (!Number.isInteger(decimales) || decimales < 0 || decimales > 20) {
throw new Error("Cantidad de decimales inválida");
}
return `${valor.toFixed(decimales)} ${unidad}`;
}
const distanciaCalculada = 12.987654321;
console.log(presentarMedicion(distanciaCalculada, 2, "m"));
console.log(distanciaCalculada); // conserva el valor para otros cálculos
Cuando el resultado reducido sí forma parte del modelo —por ejemplo, una norma exige centavos después de cada operación— esa política debe estar documentada, centralizada y cubierta por pruebas.
15 · Comprensión
Confusiones frecuentes
«Truncar y redondear producen prácticamente lo mismo»
Pueden coincidir en algunos valores, pero utilizan reglas distintas. El truncamiento descarta; el redondeo al más cercano considera las cifras eliminadas y suele tener menor error.
«Math.floor trunca cualquier número»
Solo coincide con truncamiento para valores positivos. Para negativos, Math.floor(-2.7) es -3, mientras que Math.trunc(-2.7) es -2.
«Dos decimales equivalen a dos cifras significativas»
Los decimales cuentan posiciones desde el separador; las cifras significativas comienzan en el primer dígito no nulo y se adaptan a la magnitud.
«toFixed cambia el valor guardado»
toFixed devuelve una cadena. El número original no se modifica.
«Sumar Number.EPSILON resuelve todos los redondeos»
Puede alterar algunos casos conocidos, pero no escala universalmente ni implementa reglas decimales exactas. Para requisitos estrictos se necesita otra representación.
16 · Práctica guiada
Ejercicios
Ejercicio 1: truncar y redondear
Para x = 18.3764, calculá el truncamiento y el redondeo a dos decimales. Determiná el error absoluto de cada resultado.
Ver solución
Truncamiento: 18.37, con error absoluto 0.0064. Redondeo: 18.38, con error absoluto 0.0036.
Ejercicio 2: valores negativos
Calculá Math.trunc(-4.8), Math.floor(-4.8), Math.ceil(-4.8) y Math.round(-4.5).
Ver solución
Los resultados son -4, -5, -4 y -4, respectivamente. Las cuatro funciones expresan reglas distintas.
Ejercicio 3: cifras significativas
Indicá cuántas cifras significativas tienen 0.00720, 30.04 y 5.00 × 10⁶.
Ver solución
0.00720 tiene 3 cifras; 30.04 tiene 4; 5.00 × 10⁶ tiene 3. Los ceros iniciales no cuentan, pero los internos y los finales explícitos después del separador sí.
Ejercicio 4: implementar truncamiento
Escribí una función que trunque un valor a una cantidad validada de posiciones decimales entre 0 y 10.
Ver una posible solución
function truncar(valor, decimales) {
if (!Number.isFinite(valor)) {
throw new Error("El valor debe ser finito");
}
if (!Number.isInteger(decimales) || decimales < 0 || decimales > 10) {
throw new Error("Los decimales deben estar entre 0 y 10");
}
const factor = 10 ** decimales;
return Math.trunc(valor * factor) / factor;
}
console.log(truncar(3.141592, 3)); // 3.141
Ejercicio 5: analizar acumulación
Un programa suma 0.004 mil veces y redondea a dos decimales después de cada suma. Compará el resultado con redondear únicamente el total final.
Ver solución razonada
Si comienza en cero y redondea cada paso, cada 0.004 vuelve a 0.00, por lo que el total permanece en cero. Sin redondeos intermedios, la suma es aproximadamente 4 y el resultado final redondeado es 4.00. El ejemplo muestra por qué no debemos descartar información prematuramente.
17 · Síntesis
Ideas para recordar
- Truncar descarta cifras; redondear al más cercano elige el valor disponible más próximo.
Math.trunc,Math.floor,Math.ceilyMath.roundaplican reglas diferentes.- Los empates requieren una política explícita;
Math.roundlos dirige hacia +∞. - Las posiciones decimales no son lo mismo que las cifras significativas.
toFixeddevuelve texto formateado y no modifica el número original.- El punto flotante binario puede alterar la intuición sobre empates decimales.
- Redondear en cada paso puede acumular un error mucho mayor que redondear al final.
- Las aplicaciones decimales estrictas necesitan una representación y una política apropiadas.
En el próximo tema estudiaremos la propagación del error y la cancelación: cómo pequeñas imprecisiones de entrada pueden amplificarse durante una secuencia de operaciones.