Comment gérer des nombres décimaux ? - mathalea/mathalea GitHub Wiki

Javascript gère très mal les nombres décimaux par défaut, lorsque nous aurons besoin d'utiliser des nombres décimaux, nous allons utiliser la bibliothèque decimal.js.

Un guide plus théorique et plus général est accessible via ce lien : Les nombres dans MathALÉA

1. Commencer par importer la bibliothèque decimal.js

Ajouter en haut du fichier :

import Decimal from 'decimal.js'

2. Créer un nombre décimal a qui vaut un nombre aléatoire (entier) entre 1 et 9 (par exemple)

let a = new Decimal(randint(1, 9)) // la variable a contient un objet Decimal qui vaut un nombre aléatoire (entier) entre 1 et 9
// new Decimal permet de créer un nouvel (new) objet de type (de classe) Decimal (objet dans le sens programmation orientée objet c'est à dire un truc qui possède des propriétés et des fonctions)
// Lorsqu'on crée un nouveau décimal (new Decimal), on peut lui affecter une valeur initiale entre parenthèses.
// new Decimal(45) crée un objet Decimal qui vaut 45, new Decimal(8) crée un objet qui vaut 8 etc.
// On peut directement injecter la fonction randint() qui est fréquemment utilisée pour directement créer un nombre décimal qui a une valeur initiale aléatoire

Remarque importante :

Quand on crée un Decimal, il faut faire très attention à ne pas le créer à partir d'un nombre décimal "nature" !

Par exemple, faire let a = new Decimal(randint(1, 9) / 10) est à proscrire absolument !

Si on fait ça, notre nombre décimal sera déjà vérolé à la source !

Il faut plutôt faire :

let a = new Decimal(randint(1, 9)).div(10) // La variable a contient un objet Decimal qui vaut entre 0.1 et 0.9
// On disait plus tôt qu'un nombre décimal est un objet qui possède des propriétés et des fonctions
// Et bien il possède de nombreuses fonctions (cf la liste ci-dessous) !
// Dans cet exemple, on utilise une fonction qui lui permet de se faire diviser (par 10 en l'occurrence)
// Pour utiliser une fonction ou une propriété d'un objet, on ajoute un point suivi de la fonction ou de la propriété (visuellement, une fonction a des parenthèses et une propriété non et au fond une fonction "fait des trucs" alors qu'une propriété représente une "valeur" ou un attribut de l'objet)
// Si, plus tard on veut additionner 5 au nombre a, on peut par exemple utiliser a.plus(5)

De cette façon, on aura un nombre décimal "propre"

3. Manipuler des nombres décimaux

Vous trouverez ci-dessous des exemples des fonctions les plus couramment utilisées, la liste complète étant accessible à cette adresse.

a désigne un Decimal et b désigne Decimal ou un number ou une string.

Opérations

a.add(b)              // pour faire a + b
a.plus(b)             // pour faire a + b
a.minus(b)            // pour faire a - b
a.sub(b)              // pour faire a - b
a.mul(b)              // pour faire a * b
a.times(b)            // pour faire a * b
a.div(b)              // pour faire a / b
a.dividedBy(b)        // pour faire a / b
a.pow(b)              // pour faire a puissance b
a.mod(b)              // pour faire a modulo b
a.modulo(b)           // pour faire a modulo b
a.exp()               // renvoie exp(a)
a.ln()                // renvoie ln(a)
a.sqrt()              // renvoie la racine carrée de a
a.sqrt()              // renvoie la racine carrée de a
a.negated()           // renvoie -a
a.neg()               // renvoie -a

Valeurs approchées

a.toFixed(n)          // renvoie une chaîne de caractère contenant un arrondi de a avec n décimales
a.round()             // pour arrondir a à l'unité près
a.abs()               // pour avoir la valeur absolue de a
a.floor()             // pour avoir la valeur plancher de a (approchée par défaut à l'unité près)
a.ceil()              // pour avoir la valeur plafond de a (approchée par excès à l'unité près)

Comparaisons

a.equals(b)               // renvoie true si a = b, false sinon
a.eq(b)                   // renvoie true si a = b, false sinon
a.greaterThan(b)          // renvoie true si a > b, false sinon
a.greaterThanOrEqualTo(b) // renvoie true si a >= b, false sinon
a.lessThan(b)             // renvoie true si a < b, false sinon
a.lessThanOrEqualTo(b)    // renvoie true si a <= b, false sinon
a.comparedTo(b)           // renvoie 1 si a > b, 0 si a = b et -1 si a < b
a.isPositive()            // renvoie true si a >= 0
a.isPos                   // renvoie true si a >= 0
a.isNegative()            // renvoie true si a <= -0 (le zéro a un signe pour les Decimal)
a.isNeg                   // renvoie true si a <= -0 (le zéro a un signe pour les Decimal)
a.isZero()                // renvoie true si a = 0 ou a = -0
Decimal.max(a, b)         // renvoie le maximum de a et b (le nombre d'arguments n'est pas limité, on peut ajouter c, d, e, f etc.)
Decimal.min(a, b)         // renvoie le minimum de a et b (le nombre d'arguments n'est pas limité, on peut ajouter c, d, e, f etc.)
a instance of Decimal     // renvoie true si a est bien un Decimal
a.isInteger               // renvoie true si a est un nombre entier
a.isInt                   // renvoie true si a est un nombre entier
a.isNaN                   // renvoie true si a n'est pas un nombre (Not a Number)

Bonus

pi = Decimal.acos(-1)
a.toNumber()              // convertit a en number primitif