Maison > interface Web > js tutoriel > le corps du texte

Explication détaillée du traitement des opérations sur les nombres à virgule flottante JS (tutoriel graphique)

亚连
Libérer: 2018-05-19 14:11:20
original
2369 Les gens l'ont consulté

Cet article présente principalement le traitement des opérations sur les nombres à virgule flottante JS. Maintenant, je le partage avec vous et le donne comme référence. Les amis intéressés peuvent s'y référer.

1. Description du problème

Je travaille récemment sur un projet. Il y aura des opérations sur les nombres à virgule flottante JS sur la page. dans les opérations sur les nombres à virgule flottante JS :

0.1+0.2 == 0.30000000000000004
 
0.1 + 0.7 == 0.7999999999999999
 
7*0.8 == 5.6000000000000005
 
5.6/7 == 0.7999999999999999
Copier après la connexion

2. petite erreur après le fonctionnement de JS. Net ou Java. La raison principale est que JS ne se concentre pas sur les calculs, mais parfois les projets doivent l'utiliser. Après y avoir réfléchi, il y a probablement deux solutions

A. Solution 1 :

Résultats des opérations Conservez 2 à 3 décimales. L'interface frontale utilise généralement moins d'opérations. Les exigences de précision ne sont pas trop élevées. Alors prenez juste 2 décimales.

B. Option 2 :

Convertir le nombre de décimales en opérations entières. Par exemple :


<🎜. >

Pour faciliter l'appel. Nous pouvons donc extraire une méthode publique. Par exemple, dans la bibliothèque JSMath ci-dessous, JSMath réécrit l'addition, la soustraction, la multiplication et la division. Les paramètres seront d'abord convertis en entiers, puis JSMath (paramètre). 1) sera opéré. Opération (paramètre 2)
0.1+0.2 =》 (1+2)/10 == 0.3
 
0.1 + 0.7 =》 (1+7)/10 == 0.8
 
7*0.8 == (7*8)/10 == 5.6
 
5.6/7 == (56/7)/10 == 0.1
Copier après la connexion

Le paramètre 1 et le paramètre 2 sont respectivement le premier Numéro et le deuxième Numéro de l'opération. Après calcul, la valeur est obtenue via l'attribut Valeur.


B1.Opérations de base
 (function() {
 
  var JSMath = function() {
    return this;
  }
 
  JSMath.prototype.from = function(value) {
 
    // 支持JSMath参数传递主要是用于嵌套的调用
    if ((typeof(value) == &#39;object&#39;) && (value.value != undefined)) {
      this.value = value.value;
    } else {
      this.value = value;
    }
    return this;
  }
 
  // 加法
  JSMath.prototype.add = function(value) {
    var thisValueString = this.value.toString();
    var valueString = value.toString();
    var timesCount1 = 0;
    var timesCount2 = 0;
    if (thisValueString.indexOf(&#39;.&#39;) > 0) {
      timesCount1 = thisValueString.split(&#39;.&#39;)[1].length;
    }
    if (valueString.indexOf(&#39;.&#39;) > 0) {
      timesCount2 = valueString.split(&#39;.&#39;)[1].length;
    }
    var maxtimeCount = timesCount1 > timesCount2 ? timesCount1 : timesCount2;
    this.value = (Math.pow(10, maxtimeCount) * this.value + Math.pow(10, maxtimeCount) * value) / Math.pow(10, maxtimeCount);
    return this;
  }
   
 // 减法
  JSMath.prototype.sub = function(value) {
    var thisValueString = this.value.toString();
    var valueString = value.toString();
    var timesCount1 = 0;
    var timesCount2 = 0;
    if (thisValueString.indexOf(&#39;.&#39;) > 0) {
      timesCount1 = thisValueString.split(&#39;.&#39;)[1].length;
    }
    if (valueString.indexOf(&#39;.&#39;) > 0) {
      timesCount2 = valueString.split(&#39;.&#39;)[1].length;
    }
    var maxtimeCount = timesCount1 > timesCount2 ? timesCount1 : timesCount2;
    this.value = (Math.pow(10, maxtimeCount) * this.value - Math.pow(10, maxtimeCount) * value) / Math.pow(10, maxtimeCount);
    return this;
  }
 
  // 除法  
  JSMath.prototype.p = function(value) {
    var thisValueString = this.value.toString();
    var valueString = value.toString();
    var timesCount1 = 0;
    var timesCount2 = 0;
    if (thisValueString.indexOf(&#39;.&#39;) > 0) {
      timesCount1 = thisValueString.split(&#39;.&#39;)[1].length;
    }
    if (valueString.indexOf(&#39;.&#39;) > 0) {
      timesCount2 = valueString.split(&#39;.&#39;)[1].length;
    }
    var maxtimeCount = timesCount1 > timesCount2 ? timesCount1 : timesCount2;
    this.value = ((Math.pow(10, maxtimeCount) * this.value) / (Math.pow(10, maxtimeCount) * value));
    return this;
  }
 
  // 乘法
  JSMath.prototype.times = function(value) {
 
    var thisValueString = this.value.toString();
    var valueString = value.toString();
    var timesCount1 = 0;
    var timesCount2 = 0;
    if (thisValueString.indexOf(&#39;.&#39;) > 0) {
      timesCount1 = thisValueString.split(&#39;.&#39;)[1].length;
    }
    if (valueString.indexOf(&#39;.&#39;) > 0) {
      timesCount2 = valueString.split(&#39;.&#39;)[1].length;
    }
    var maxtimeCount = timesCount1 > timesCount2 ? timesCount1 : timesCount2;
    this.value = (Math.pow(10, maxtimeCount) * this.value * Math.pow(10, maxtimeCount) * value) / Math.pow(10, maxtimeCount * 2);
    return this;
  }
 
  if (window.JSMath == undefined) {
    window.JSMath = function(value) {
      var result = new JSMath();
      result.from(value);
      return result;
    }
  }
})()
Copier après la connexion


B2. Opérations multi-objets
  0.1+0.2
=> JSMath(0.1).add(0.2).value == 0.3
 
7+0.8
=> JSMath(7).times(0.8).value == 5.6
 
5.6/7
=> JSMath(5.6).p(7).value = 0.8
Copier après la connexion


Ce qui précède est ce que j'ai compilé pour vous, j'espère qu'il vous sera utile. l'avenir.
  0.05 + 0.05 + 0.2
=> JSMath(JSMath(0.05).add(0.05)).add(0.2).value == 0.3
 
(5+0.6)/7
=> JSMath(JSMath(5).add(0.6)).p(7).value == 0.8
Copier après la connexion

Articles connexes :

JS

Concept de fonction auto-exécutable anonyme et instructions d'utilisation

p5 . Comment implémenter et utiliser l'interaction avec la souris js

Résumé des compétences en analyse de données JS


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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!