Heim >Web-Frontend >js-Tutorial >Detaillierte Erläuterung der Probleme bei der js-Gleitkommaberechnung
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
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
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
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
// 通过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
<br>
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!