Introducción a bigNumber.js para cálculos de alta precisión

Motivación para usar bigNumber.jsEn proyectos que requieren un alto nivel de precisión en los cálculos numéricos, es común encontrar problemas debido a la pérdida de precisión. Un ejemplo clásico es el caso donde 0.1 + 0.2 no es igual a 0.3, sino a 0.30000000000000004. Para evitar estos errores, se utiliza la biblioteca bigNumber.js, una librería de JavaScript diseñada para realizar aritmética de precisión arbitraria.

**¿Por qué se pierde la precisión?**El resultado 0.1 + 0.2 = 0.30000000000000004 se debe a cómo JavaScript almacena los números siguiendo el estándar internacional IEEE 754. Este formato utiliza 64 bits para almacenar números, donde los primeros 52 bits representen la fracción, los siguientes 11 bits el exponente y el último bit el signo. Los números decimales se convierten a binario, y algunos, como 0.1, resultan en una fracción periódica en binario, lo que provoca un truncamiento y, por ende, una pérdida de precisión.

Instalación de bigNumber.js

  1. Puedes descargra la biblioteca desde: GitHub Releases
  2. O instalarla mediante npm:
npm install bignumber.js --save

  1. Importarla en tu proyecto:
import { BigNumber } from 'bignumber.js';

Uso de bigNumber.js

1. Creación de un objeto BigNumber

Para crear un nuevo número con bigNumber.js, se usa el constructor BigNumber:

const valor = new BigNumber(-1000);
console.log(valor); // Muestra { s: -1, e: 3, c: [1000] }

Donde:

  • s: Indica el signo (1 para positivo, -1 para negativo).
  • e: Es el exponente.
  • c: Es el coeficiente, o valor numérico.

2. Métodos estáticos

A continuación, se presentan algunos métodos útiles de bigNumber.js:

2.1 Valor absoluto: .abs()
const numero = new BigNumber(-0.8);
const absoluto = numero.abs();
console.log(absoluto.toString()); // 0.8

2.2 Comparación: .comparedTo() y .isEqualTo()

Estos métodos permiten comparar dos números:

const a = new BigNumber(0.1);
const b = new BigNumber(0.2);
const comparacion = a.comparedTo(b);
console.log(comparacion); // -1, porque 0.1 < 0.2

const igualdad = a.isEqualTo(b);
console.log(igualdad); // false

2.3 Redondeo de decimales: .dp()

Este método permite especificar cuántos decimales se desean conservar:

const decimal = new BigNumber(1234.5678);
const redondeado = decimal.dp(2);
console.log(redondeado.toString()); // 1234.57

2.4 División: .div()

Permite dividir dos números, incluso en diferentes bases:

const dividendo = new BigNumber(355);
const division = dividendo.div(5);
console.log(division.toString()); // 71

2.5 División entera: .idiv()

Devuelve solo la parte entera del cociente:

const entero = new BigNumber(5);
const divisionEntera = entero.idiv(0.7);
console.log(divisionEntera.toString()); // 7

2.6 Potencia: .pow()

Eleva un número a una potencia dada:

const base = new BigNumber(0.7);
const potencia = base.pow(2);
console.log(potencia.toString()); // 0.49

2.7 Truncamiento: .integerValue()

Obtiene la parte entera de un número, redondeando hacia abajo:

const numeroNegativo = new BigNumber(-12.7);
const enteroTruncado = numeroNegativo.integerValue();
console.log(enteroTruncado.toString()); // -13

2.8 Formato: .toFormat()

Permite formatear un número según un patrón específico:

const formato = {
  prefix: 'start=>',
  decimalSeparator: '.',
  groupSeparator: ',',
  groupSize: 3,
  fractionGroupSeparator: '-',
  fractionGroupSize: 2,
  suffix: '<=end'
};

const formateado = new BigNumber(123456789.123456789).toFormat(formato);
console.log(formateado); // start=>123,456,789.12-34-56-79<=end

2.9 Conversión a fracción: .toFraction()

Convierte un número decimal a una fracción:

const pi = new BigNumber('3.14159265358');
const fraccion = pi.toFraction();
console.log(fraccion); // [157079632679, 50000000000]

2.10 Otros métodos
  • .toJSON(): Convierte un número a una cadena JSON.
  • .toNumber(): Convierte un número a un tipo primitivo.
  • .toString(): Convierte un número a una cadena.
  • .valueOf(): Devuelve el valor primitivo del número.

Puedes explorar más sobre bigNumber.js en su documentación oficial para descubrir todos sus métodos y capacidades.

Etiquetas: bigNumber.js JavaScript aritmética de precisión IEEE 754 cálculos numéricos

Publicado el 8-21 09:36