Heim > Web-Frontend > js-Tutorial > Hauptteil

Detaillierte Erläuterung der Verarbeitung von JS-Gleitkommazahlenoperationen (grafisches Tutorial)

亚连
Freigeben: 2018-05-19 14:11:20
Original
2436 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die Verarbeitung von JS-Gleitkommazahlenoperationen vor. Jetzt teile ich ihn mit Ihnen und gebe ihn als Referenz. Interessierte Freunde können darauf verweisen.

1. Problembeschreibung

Ich arbeite kürzlich an einem Projekt mit einigen JS-Gleitkommazahlenoperationen in JS-Gleitkommazahlenoperationen:

0.1+0.2 == 0.30000000000000004
 
0.1 + 0.7 == 0.7999999999999999
 
7*0.8 == 5.6000000000000005
 
5.6/7 == 0.7999999999999999
Nach dem Login kopieren

2 Fehler nach JS-Operationen. Der Hauptgrund ist, dass der Fokus von JS nicht auf Berechnungen liegt, aber manchmal müssen Projekte es verwenden. Nach dem Nachdenken gibt es wahrscheinlich zwei Lösungen 🎜>A Lösung 1:

Behalten Sie das Berechnungsergebnis bei 2 bis 3 Dezimalstellen. Die Front-End-Schnittstelle verwendet im Allgemeinen weniger Operationen. Die Genauigkeitsanforderungen sind nicht zu hoch. Nehmen Sie also einfach 2 Dezimalstellen.

B. Option 2:

Konvertieren Sie die Anzahl der Dezimalstellen in Ganzzahloperationen. Beispiel:

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
Nach dem Login kopieren


Um den Aufruf zu erleichtern, können wir beispielsweise in der folgenden JSMath-Bibliothek die Parameter Addition, Subtraktion, Multiplikation und Division in Ganzzahlen umwandeln, bevor JSMath (Parameter 1) ausgeführt wird . Operation (Parameter 2)

Parameter 1 und Parameter 2 sind die erste Zahl bzw. die zweite Zahl der Operation. Nach der Berechnung wird der Wert über das Value-Attribut ermittelt.

 (function() {
 
  var JSMath = function() {
    return this;
  }
 
  JSMath.prototype.from = function(value) {
 
    // 支持JSMath参数传递主要是用于嵌套的调用
    if ((typeof(value) == 'object') && (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('.') > 0) {
      timesCount1 = thisValueString.split('.')[1].length;
    }
    if (valueString.indexOf('.') > 0) {
      timesCount2 = valueString.split('.')[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('.') > 0) {
      timesCount1 = thisValueString.split('.')[1].length;
    }
    if (valueString.indexOf('.') > 0) {
      timesCount2 = valueString.split('.')[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('.') > 0) {
      timesCount1 = thisValueString.split('.')[1].length;
    }
    if (valueString.indexOf('.') > 0) {
      timesCount2 = valueString.split('.')[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('.') > 0) {
      timesCount1 = thisValueString.split('.')[1].length;
    }
    if (valueString.indexOf('.') > 0) {
      timesCount2 = valueString.split('.')[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;
    }
  }
})()
Nach dem Login kopieren


B1. Grundoperationen

  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
Nach dem Login kopieren


B2. Operationen mit mehreren Objekten

  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
Nach dem Login kopieren


Das Obige habe ich für alle zusammengestellt. Ich hoffe, dass es in Zukunft für alle hilfreich sein wird.

Verwandte Artikel:

JS

Anonymes selbstausführendes Funktionskonzept und Nutzungsanweisungen

p5 . Wie man js-Mausinteraktion implementiert und verwendet

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verarbeitung von JS-Gleitkommazahlenoperationen (grafisches Tutorial). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage