


Au-delà de JavaScript – Pourquoi n'est-ce pas égal en programmation
JavaScript est fréquemment ridiculisé lorsque les développeurs rencontrent pour la première fois ce résultat apparemment déroutant :
0.1 + 0.2 == 0.30000000000000004
Les mèmes sur la gestion des nombres par JavaScript sont très répandus, ce qui amène souvent beaucoup à croire que ce comportement est propre au langage.
Cependant, cette bizarrerie ne se limite pas à JavaScript. C'est une conséquence de la façon dont la plupart des langages de programmation gèrent l'arithmétique à virgule flottante.
Par exemple, voici des extraits de code de Java et Go qui produisent des résultats similaires :
Les ordinateurs ne peuvent stocker nativement que des entiers. Ils ne comprennent pas les fractions. (Comment le feront-ils ? La seule manière pour les ordinateurs de faire du calcul est d'allumer ou d'éteindre certaines lumières. La lumière peut être allumée ou éteinte. Elle ne peut pas être « à moitié » allumée !) Ils ont besoin d'un moyen de représenter les nombres à virgule flottante. . Comme cette représentation n'est pas parfaitement précise, le plus souvent, 0,1 0,2 n'est pas égal à 0,3.
Toutes les fractions dont les dénominateurs sont constitués de facteurs premiers de la base du système numérique peuvent être exprimées proprement, tandis que toutes les autres fractions auraient des décimales répétitives. Par exemple, dans le système numérique en base 10, les fractions comme 1/2, 1/4, 1/5, 1/10 sont clairement représentées car les dénominateurs dans chaque cas sont constitués de 2 ou 5 - les facteurs premiers de 10. . Cependant, les fractions comme 1/3, 1/6, 1/7 ont toutes des décimales récurrentes.
.De même, dans le système binaire, les fractions comme 1/2, 1/4, 1/8 sont exprimées proprement tandis que toutes les autres fractions ont des décimales récurrentes. Lorsque vous effectuez des opérations arithmétiques sur ces décimales récurrentes, vous vous retrouvez avec des restes qui sont conservés lorsque vous convertissez la représentation binaire des nombres de l'ordinateur en une représentation en base 10 lisible par l'homme. C'est ce qui conduit à des résultats à peu près corrects.
Maintenant que nous avons établi que ce problème n'est pas exclusif à JavaScript, explorons comment les nombres à virgule flottante sont représentés et traités sous le capot pour comprendre pourquoi ce comportement se produit.
Afin de comprendre comment les nombres à virgule flottante sont représentés et traités sous le capot, nous devons d'abord comprendre la norme IEEE 754 à virgule flottante.
La norme IEEE 754 est une spécification largement utilisée pour représenter et effectuer des opérations arithmétiques sur des nombres à virgule flottante dans les systèmes informatiques. Il a été créé pour garantir la cohérence lors de l'utilisation de l'arithmétique à virgule flottante sur diverses plates-formes informatiques. La plupart des langages de programmation et des implémentations matérielles (CPU, GPU, etc.) adhèrent à cette norme.
Voici comment un nombre est noté au format IEEE 754 :
Ici s est le bit de signe (0 pour positif, 1 pour négatif), M est la mantisse (contient les chiffres du nombre) et E est l'exposant qui détermine l'échelle du nombre.
Vous ne pourrez pas trouver de valeurs entières pour M et E pouvant représenter exactement des nombres comme 0,1, 0,2 ou 0,3 dans ce format. Nous ne pouvons choisir que les valeurs pour M et E qui donnent le résultat le plus proche.
Voici un outil que vous pouvez utiliser pour déterminer les notations IEEE 754 des nombres décimaux : https://www.h-schmidt.net/FloatConverter/IEEE754.html
IEEE 754notation de 0,25 :
Notation IEEE 754 de 0,1 et 0,2 respectivement :
Veuillez noter que l'erreur due à la conversion dans le cas de 0,25 était de 0, tandis que 0,1 et 0,2 avaient des erreurs non nulles.
IEEE 754 définit les formats suivants pour représenter les nombres à virgule flottante :
Simple précision (32 bits) : 1 bit pour le signe, 8 bits pour l'exposant, 23 bits pour la mantisse
Double précision (64 bits) : 1 bit pour le signe, 11 bits pour l'exposant, 52 bits pour la mantisse
Par souci de simplicité, considérons le format simple précision qui utilise 32 bits.
La représentation 32 bits de 0,1 est :
0 01111011 10011001100110011001101
Here the first bit represents the sign (0 which means positive in this case), the next 8 bits (01111011) represent the exponent and the final 23 bits (10011001100110011001101) represent the mantissa.
This is not an exact representation. It represents ≈ 0.100000001490116119384765625
Similarly, the 32 bit representation of 0.2 is:
0 01111100 10011001100110011001101
This is not an exact representation either. It represents ≈ 0.20000000298023223876953125
When added, this results in:
0 01111101 11001101010011001100110
which is ≈ 0.30000001192092896 in decimal representation.
In conclusion, the seemingly perplexing result of 0.1 + 0.2 not yielding 0.3 is not an anomaly specific to JavaScript, but a consequence of the limitations of floating-point arithmetic across programming languages. The roots of this behaviour lie in the binary representation of numbers, which inherently leads to precision errors when handling certain fractions.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT
Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Cet article présentera comment utiliser JavaScript pour réaliser l'effet de cliquer sur les images. L'idée principale est d'utiliser l'attribut Data- * de HTML5 pour stocker le chemin d'image alternatif et écouter des événements de clic via JavaScript, changez dynamiquement les attributs SRC, réalisant ainsi la commutation d'image. Cet article fournira des exemples de code et des explications détaillés pour vous aider à comprendre et à maîtriser cet effet interactif couramment utilisé.

Tout d'abord, vérifiez si le navigateur prend en charge GeolocationAPI. Si vous êtes pris en charge, appelez getCurrentPosition () pour obtenir les coordonnées de l'emplacement actuelles de l'utilisateur et obtenir les valeurs de latitude et de longitude grâce à des rappels réussis. Dans le même temps, fournissez des exceptions de traitement des rappels d'erreur tels que l'autorisation de déni, l'indisponibilité de l'emplacement ou du délai d'attente. Vous pouvez également transmettre des options de configuration pour activer une précision élevée, définir le délai d'expiration et la période de validité du cache. L'ensemble du processus nécessite l'autorisation de l'utilisateur et la gestion des erreurs correspondante.

Cet article vise à résoudre le problème du retour null lors de l'obtention d'éléments DOM via document.getElementById () dans JavaScript. Le noyau consiste à comprendre le synchronisation d'exécution du script et l'état de l'analyse DOM. En plaçant correctement la balise ou en utilisant l'événement téléchargé DomContent, vous pouvez vous assurer que l'élément est à nouveau tenté lorsqu'il est disponible, en évitant efficacement de telles erreurs.

Pour créer un intervalle de répétition dans JavaScript, vous devez utiliser la fonction setInterval (), qui exécutera à plusieurs reprises des fonctions ou des blocs de code à des intervalles de millisecondes spécifiés. Par exemple, setInterval (() => {Console.log ("Exécuter toutes les 2 secondes");}, 2000) publiera un message toutes les 2 secondes jusqu'à ce qu'il soit effacé par ClearInterval (Interpalid). Il peut être utilisé dans les applications réelles pour mettre à jour les horloges, les serveurs de sondage, etc., mais faire attention à la limite de retard minimum et à l'impact du temps d'exécution de la fonction, et effacez l'intervalle dans le temps lorsqu'il n'est plus nécessaire pour éviter les fuites de mémoire. Surtout avant la désinstallation des composants ou la fermeture des pages, assurez-vous que

L'utilisation du noyau de l'API de composition de Nuxt3 comprend: 1. DefinePageMeta est utilisée pour définir les méta-informations de la page, telles que le titre, la mise en page et le middleware, qui doivent être appelées directement et ne peuvent pas être placées dans des déclarations conditionnelles; 2. Usyhead est utilisé pour gérer les balises d'en-tête de page, prend en charge les mises à jour statiques et réactives et doit coopérer avec DefinePageMeta pour obtenir l'optimisation du référencement; 3. USEASYNCDATA est utilisé pour obtenir en toute sécurité des données asynchrones, gérer automatiquement l'état de chargement et d'erreur et prend en charge le contrôle d'acquisition de données du serveur et du client; 4. UseFetch est une encapsulation de usEasyncdata et $ fetch, qui dépente automatiquement la clé de demande pour éviter les demandes en double

Utilisez la méthode WriteText de ClipboardAPI pour copier du texte dans le presse-papiers, il doit être appelé dans le contexte de sécurité et l'interaction utilisateur, prend en charge les navigateurs modernes et l'ancienne version peut être dégradée avec EXECCOMAND.

ThebestatorreatEAmulti-linestringinjavascriptsisingstingTemplatalalswithbackticks, qui sepresereBreakenexactlyAswritten.

Ce tutoriel explique en détail comment formater les numéros en chaînes avec deux décimales fixes en JavaScript, même les entiers peuvent être affichés sous la forme de "# .00". Nous nous concentrerons sur l'utilisation de la méthode numéro.prototype.tofixed (), y compris sa syntaxe, sa fonctionnalité, son exemple de code et des points clés à noter, comme son type de retour étant toujours une chaîne.
