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

Detaillierte Erläuterung der Probleme bei der js-Gleitkommaberechnung

零下一度
零下一度Original
2017-06-30 10:18:091331Durchsuche

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

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

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

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

<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!

Stellungnahme:
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