Heim > Web-Frontend > js-Tutorial > Detaillierte Erläuterung der Probleme bei der js-Gleitkommaberechnung

Detaillierte Erläuterung der Probleme bei der js-Gleitkommaberechnung

零下一度
Freigeben: 2017-06-30 10:18:09
Original
1424 Leute haben es durchsucht

Analyse

JavaScript hat nur einen Zahlentyp Number und alle Zahlen in Javascript werden im IEEE-754-Standardformat dargestellt. Das Präzisionsproblem von Gleitkommazahlen betrifft nicht nur JavaScript, da einige Dezimalzahlen unendlich viele Ziffern haben, die binär ausgedrückt werden:

0.1              0.0001100110011001100110011001100110011001100110011001101
0.2              0.001100110011001100110011001100110011001100110011001101
0.3              0.010011001100110011001100110011001100110011001100110011
0.5              0.1
0.6              0.10011001100110011001100110011001100110011001100110011
Nach dem Login kopieren

So kann das Programm beispielsweise 1.1 nicht tatsächlich verwenden Eigentlich bedeutet es „1.1“, aber es kann nur bis zu einem gewissen Grad genau sein. Dies ist ein unvermeidlicher Verlust an Präzision:

1.09999999999999999
Nach dem Login kopieren

In JavaScript ist das Problem komplizierter. Hier sind nur einige Testdaten in Chrome:

 输入               输出1.0-0.9 == 0.1     False1.0-0.8 == 0.2     False1.0-0.7 == 0.3     False1.0-0.6 == 0.4     True1.0-0.5 == 0.5     True1.0-0.4 == 0.6     True1.0-0.3 == 0.7     True1.0-0.2 == 0.8     True1.0-0.1 == 0.9     True
Nach dem Login kopieren

Lösung

So vermeiden Sie diese Art von Nicht-Fehlertyp „1.0-0.9 != 0.1“. Probleme durch Wolltuch? Das Folgende ist eine häufig verwendete Lösung, bevor das Ergebnis der Gleitkommaoperation beurteilt wird, da der Präzisionsreduzierungsprozess immer automatisch gerundet wird:

(1.0-0.9).toFixed(digits)     // toFixed() 精度参数须在 0 与20 之间(1.0-0.9).toFixed(10)== 0.1   // 结果为True(1.0-0.8).toFixed(10)== 0.2   // 结果为True(1.0-0.7).toFixed(10)== 0.3   // 结果为True(11.0-11.8).toFixed(10) == -0.8   // 结果为TrueparseFloat((1.0-0.9).toFixed(10)) === 0.1   // 结果为TrueparseFloat((1.0-0.8).toFixed(10)) === 0.2   // 结果为TrueparseFloat((1.0-0.7).toFixed(10)) === 0.3   // 结果为TrueparseFloat((11.0-11.8).toFixed(10)) === -0.8   // 结果为True
Nach dem Login kopieren

Methode Verfeinerung

// 通过isEqual工具方法判断数值是否相等function isEqual(number1, number2, digits){
    digits = digits || 10; // 默认精度为10return number1.toFixed(digits) === number2.toFixed(digits);
}

isEqual(1.0-0.7, 0.3);  // return true// 原生扩展方式,更喜欢面向对象的风格Number.prototype.isEqual = function(number, digits){
    digits = digits || 10; // 默认精度为10return this.toFixed(digits) === number.toFixed(digits);
}

(1.0-0.7).isEqual(0.3); // return true
Nach dem Login kopieren

<br>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Probleme bei der js-Gleitkommaberechnung. 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