Fermer

septembre 22, 2021

Décimales sans limitations en JavaScript


Vous ne voulez pas d'erreurs dans vos applications commerciales ou scientifiques, n'est-ce pas ?

Dans le blog précédentnous avons vu les problèmes que nous pouvons rencontrer lors de l'utilisation du type de nombre en JavaScript.

Dans ce blog, nous verrons comment l'utilisation d'une bibliothèque décimale peut aider à résoudre ces problèmes.

Par exemple, Corticon.js utilise une bibliothèque décimale pour implémenter son type de données décimal low-code/no-code. La bibliothèque prend en charge les nombres avec n'importe quelle précision, les nombres petits et grands arbitraires et toutes les opérations mathématiques typiques, ce qui la rend adaptée aux applications commerciales et scientifiques.

Dans ce blog, nous mettrons en évidence les caractéristiques clés des décimales. Nous passerons également par la représentation des décimales dans la charge utile JSON. Et enfin, nous explorerons les options dont vous disposez pour configurer les décimales pour des performances maximales et si vous devez gérer des nombres extrêmement grands ou petits.

Limitations du type de nombre JavaScript

Nous avons vu dans ce blog que les nombres JavaScript ont certaines limitations qui peuvent être préjudiciables aux applications scientifiques et commerciales.

Voici un résumé de ces problèmes :

  • Résultats incorrects avec des nombres inexacts.
  • Les calculs flottants ne sont pas déterministes.
  • Les nombres très grands ou très petits ne peuvent pas être traités, en particulier lors de l'utilisation d'entiers.

Veuillez vous référer au le blog pour plus de détails.

Bibliothèque décimale

Une bibliothèque décimale peut aider à résoudre ces problèmes. Dans Corticon.js, nous exploitons une excellente bibliothèque décimale pour implémenter notre type de données décimal. La bibliothèque s'appelle decimal.js et vous pouvez trouver la doc ici. Il est également disponible sur Github à l'adresse https://github.com/MikeMcl/decimal.js.

La principale caractéristique de cette bibliothèque et par extension, le type de données Corticon.js Decimal, est qu'elles peuvent représenter et opérer sur des nombres avec une précision arbitraire. Cela permet la prise en charge d'applications commerciales et scientifiques, car nous pouvons effectuer des calculs avec des nombres arbitraires petits ou grands et sélectionner la précision nécessaire. .js par rapport au type de nombre en JavaScript.

Nous pouvons effectuer les opérations suivantes, par exemple, contrairement à l'utilisation du nombre JavaScript, 0,1 + 0,2 est égal à 0,3. Ou dans une application scientifique, on pourrait multiplier 123456789e+250 par 10e+150. Cela donnera le résultat correct 1.23456789e+409 (en JavaScript, ceux-ci dépasseraient le nombre maximum).

Alors, comment n'y a-t-il pas de limitations ? Tout simplement parce que vous pouvez configurer la précision des nombres. La précision est un paramètre de configuration et est un concept clé à comprendre.

De quoi s'agit-il exactement ? Ce paramètre est le nombre de chiffres significatifs utilisés pour renvoyer les résultats (c'est-à-dire le nombre de chiffres renvoyés auxquels les calculs sont arrondis). Voir ce lien.

Par défaut, ce paramètre est défini sur 20. La plupart du temps, cette valeur par défaut sera suffisante, mais dans certains cas, vous souhaiterez peut-être l'ajuster en fonction de vos besoins. Le compromis est que le temps de calcul augmentera avec des chiffres plus précis. En d'autres termes, plus la précision est élevée, plus vous aurez de chiffres pour représenter des nombres, mais les calculs prendront plus de CPU.

Ne soyez pas confus : la précision n'est pas le nombre de décimales. Au lieu de cela, il s'agit du nombre de chiffres significatifs utilisés pour exprimer les nombres renvoyés.

Regardons quelques exemples pour voir l'effet et la signification du paramètre de précision.

Nous utiliserons des ensembles de précision à 5. C'est un valeur irréaliste pour la plupart des cas, mais il est plus facile de comprendre les exemples ci-dessous.

Exemple 1 :

L'arrondi a lieu pour les petits nombres.

Decimal 0.123456789 multiplié par 1 donnera 0.12346 (5 est arrondi car il est suivi de 6).

Decimal 0,123456789 plus 1000 donnera 1000,1 (avec seulement 5 chiffres de précision, nous perdons la partie fractionnaire 0,023456789).

Exemple 2:[19659026]Mais les grands nombres peuvent contenir 5 chiffres ou moins. Par exemple :

1 000 000 000 décimal plus 2 000 000 000 000 décimal donneront le résultat correct 3 000 000 000 000.

C'est parce que ces nombres peuvent être exprimés avec 5 chiffres ou moins. Par exemple, ils pourraient être exprimés sous la forme 1 x 10e12 et 2 x 10e12. Pour ces deux nombres, nous n'avons besoin que de 3 chiffres : un pour le nombre et 2 pour l'exposant.

Par exemple, nous pouvons voir la représentation interne dans la bibliothèque decimal.js du premier nombre ci-dessous à l'aide d'un inspecteur de débogage :[19659003]Internal Number representation" title="Internal Number representation"/></p>
<p>Voici un dernier exemple pour montrer l'arrondi avec de grands nombres : Decimal 1,234,567,890,123 multiplié par Decimal 1 donnera <strong>1234600000000</strong>. Ici , l'arrondi s'effectue au 5e chiffre.</p>
<p>Il existe plusieurs façons d'arrondir les nombres. Consultez la dernière section sur les options de configuration du mode d'arrondi.</p>
<h2><strong>JSON Payload Representation</strong></h2>
<p>Corticon.js est utilisé pour implémenter low Services de décision -code/no-code. Ces services agissent sur une charge utile d'entrée JSON et renverront une charge utile de sortie ; en tant que tel, nous devons comprendre comment passer des décimales au service de décision et quelles sont les attentes pour les décimales renvoyées dans le sortir payload.</p>
<h3>Input payload :</h3>
<p>Corticon.js acceptera et construira un nombre décimal représenté sous forme de nombre ou de chaîne, ou sous forme de chaîne utilisant la notation d'exposant.</p>
<p>Par exemple, ce qui suit est valide :[19659003]{ « coût » : 100.56, « coût2 » : « 100.56 », « coût3 » : '10056e-2' }</p>
<p>La représentation numérique ou sous forme de chaîne devrait être utile pour les applications commerciales, tandis que la notation d'exposant sera plus utile pour applications scientifiques.</p>
<h3>Output Payload :</h3>
<p>Les décimales sont toujours renvoyées sous forme de chaînes dans JSON, car le type de nombre ne peut pas représenter toutes les valeurs décimales possibles.</p>
<p>Si vous travaillez sur une application scientifique, vous avez la possibilité de forcer tous les nombres doivent être sortis avec une notation d'exposant, ou vous pouvez ajuster à quel niveau le moteur renvoie des nombres avec une notation d'exposant. Cela se fait à l'aide de ces 2 éléments de configuration : </p>
<ul style=

  • toExpPos : la valeur d'exposant positive à laquelle et au-dessus de laquelle toString renvoie la notation exponentielle.
    Remarque : lorsqu'elle est définie sur 0, la notation d'exposant est toujours renvoyée.
  • toExpNeg : la valeur d'exposant négative à laquelle et en dessous de laquelle toString renvoie la notation exponentielle.
    Remarque : lorsqu'elle est définie sur 0, la notation d'exposant est toujours renvoyée.
  • Voir la section suivante pour une description de toutes les configurations options.

    Autres options de configuration

    Voici des champs de configuration supplémentaires pour contrôler les opérations décimales :

    La configuration doit être insérée dans l'objet de configuration principal dans le champ "decimal."

    • précision : Le nombre maximum de chiffres significatifs du résultat d'une opération.
      nombre : entier, de 1 à 1e+9 inclus
      Valeur par défaut : 20
    • arrondi : Le mode d'arrondi par défaut utilisé lors de l'arrondi de la résolution ult d'une opération à la précision des chiffres significatifs.
      Valeur par défaut : 4 (ROUND_HALF_UP)
      0 Arrondis à partir de zéro
      1 Arrondis vers zéro
      2 Arrondis vers l'infini
      3 Arrondis vers -Infinity
      4 Ronds vers le voisin le plus proche. Si équidistant, arrondi à partir de zéro
      5 Arrondit vers le voisin le plus proche. Si équidistant, arrondit vers zéro
      6 Arrondit vers le plus proche voisin. Si équidistant, arrondit vers le voisin pair
      7 Arrondit vers le voisin le plus proche. Si équidistant, arrondit vers Infinity
      8 Arrondit vers le voisin le plus proche. Si équidistants, les arrondis vers -Infinity
      Les modes d'arrondi 0 à 6 (inclus) sont les mêmes que ceux de la classe BigDecimal de Java.

    Voir pour référence https://www.mathsisfun.com/ number/rounding-methods.html et https://en.wikipedia.org/wiki/Rounding.

    Exemple :

    const config = {

    decimal : {

    arrondi : 6,

    précision : 50,

    àExpPos : 100,

    àExpNeg : -100

    }

    . .. autres éléments de configuration...

    }

     

    En conclusion, comme nous l'avions vu dans le précédent blogon peut avoir des problèmes de calcul avec les nombres JavaScript.

    Corticon. js prend en charge les applications commerciales et scientifiques à l'aide d'un type décimal robuste qui évite les problèmes avec les nombres JavaScript. Il a également la capacité d'exprimer des nombres arbitraires petits et grands, ce qui le rend adapté aux applications commerciales et scientifiques les plus exigeantes.




    Source link