Fundamentos · Tema 04

Redondeo, truncamiento y cifras significativas

Cómo reducir la cantidad de cifras de un valor, medir la información descartada y evitar que una decisión de presentación altere el cálculo.

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.

Truncamiento a dos posiciones decimales.
Valor originalValor truncadoError con signo
7.1287.12−0.008
7.1297.12−0.009
−7.128−7.12+0.008
0.00490.00−0.0049

Truncar hacia una cantidad fija de decimales equivale a desplazarlos, aplicar una operación hacia cero y restaurar la escala:

truncar(x, d) = trunc(x × 10d) / 10d
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.
Redondeo al más cercano con dos posiciones decimales.
Valor originalResultadoMotivo
7.1237.12La cifra siguiente es 3
7.1267.13La cifra siguiente es 6
7.125Depende de la reglaExiste un empate decimal
99.999100.00El 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:

Ea ≤ u / 2

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.

Resultados al reducir 2.5 y −2.5 a un entero.
Modo2.5−2.5Descripción
Hacia cero2−2Descarta la fracción
Hacia +∞3−2Menor entero que no es inferior
Hacia −∞2−3Mayor entero que no es superior
Empates hacia +∞ de Math.round3−2Los empates avanzan hacia el valor positivo
Empates al par2−2Elige el vecino cuya última cifra es par
Empates lejos de cero3−3Regla 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.

2.5 → 2    3.5 → 4    4.5 → 4    5.5 → 6

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.

Valores redondeados a dos posiciones decimales.
OriginalDos decimalesCifras significativas visibles
1234.5671234.576
12.3456712.354
0.12345670.122
0.0012340.00Ninguna 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.

Identificación de cifras significativas.
Valor escritoCantidadExplicación
0.004563Los ceros iniciales solo ubican el separador
1.0204Los ceros interiores y el cero final decimal son informativos
70024Los ceros entre dígitos no nulos cuentan
1500AmbiguoLa escritura no indica si los ceros finales fueron medidos
1.50 × 10³3La 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.

factor = 10n−1−⌊log₁₀(|x|)⌋
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:

Comparación del error introducido.
MétodoAproximaciónError con signoError absoluto
Truncamiento8.37−0.0060.006
Redondeo8.38+0.0040.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.

→ 0

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.

par

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.

EXPERIMENTO 04

Información descartada

x = 12.9876 · d = 2

Los resultados numéricos aparecen debajo.
Truncamiento12,98
Error al truncar0,0076
Redondeo12,99
Error al redondear0,0024

Para este valor, el redondeo produce el menor error absoluto.

Preguntas para explorar

  1. Compará un valor positivo y uno negativo. ¿En qué dirección actúa el truncamiento?
  2. Seleccioná “Con acarreo”. ¿Por qué cambia la parte entera?
  3. Reducí las posiciones del ejemplo pequeño hasta que el resultado sea cero.
  4. 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.ceil y Math.round aplican reglas diferentes.
  • Los empates requieren una política explícita; Math.round los dirige hacia +∞.
  • Las posiciones decimales no son lo mismo que las cifras significativas.
  • toFixed devuelve 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.