Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Gleitkomma-Dezimalvergleich: Warum nicht gleich?

PHP-Gleitkomma-Dezimalvergleich: Warum nicht gleich?

WBOY
WBOYOriginal
2024-03-08 16:24:041114Durchsuche

PHP-Gleitkomma-Dezimalvergleich: Warum nicht gleich?

PHP-Gleitkomma-Dezimalvergleich: Warum nicht gleich?

Beim Programmieren stoßen wir oft auf Situationen, in denen wir vergleichen müssen, ob zwei Gleitkomma-Dezimalzahlen gleich sind. Wenn wir jedoch PHP verwenden, um Gleitkomma-Dezimalzahlen zu vergleichen, stellen wir oft fest, dass zwei scheinbar gleiche Gleitkommazahlen aufgrund von Präzisionsproblemen nicht gleich sind. Diese Situation ist oft verwirrend. Dieser Artikel befasst sich mit dem Problem des Gleitkommazahlenvergleichs in PHP und gibt konkrete Codebeispiele, um zu veranschaulichen, warum beim Vergleich von Gleitkommazahlen ungleiche Situationen auftreten.

In Computern werden Gleitkommazahlen binär dargestellt. Da Binärzahlen bestimmte Dezimalzahlen (z. B. 0,1) nicht genau darstellen können, sind Gleitkommazahlen in Computern häufig Näherungswerte. Dies führt zu Genauigkeitsproblemen beim Vergleich von Gleitkommazahlen und es treten häufig Situationen wie 0,1 + 0,2 != 0,3 auf.

Lassen Sie uns dieses Problem anhand eines konkreten Beispiels veranschaulichen. Angenommen, wir haben zwei Gleitkommazahlen 0,1 und 0,2 und versuchen mit PHP zu vergleichen, ob ihre Summe gleich 0,3 ist:

$num1 = 0.1;
$num2 = 0.2;

$sum = $num1 + $num2;
$expected = 0.3;

if ($sum == $expected) {
    echo "相等";
} else {
    echo "不相等";
}

Wenn wir den obigen Code ausführen, ist es wahrscheinlich, dass das Ausgabeergebnis „ungleich“ ist. Dies liegt daran, dass 0,1, 0,2 und 0,3 keine exakten Werte im Computer sind, sondern Näherungswerte, sodass es bei Vergleichen zu Präzisionsfehlern kommen kann.

Um dieses Problem zu lösen, können wir die in PHP integrierte Funktion round() verwenden, um Gleitkommazahlen zu runden und so Präzisionsfehler zu vermeiden. Ändern Sie den obigen Code wie folgt: round()来对浮点数进行四舍五入,从而避免精度误差。修改上面的代码如下:

$num1 = 0.1;
$num2 = 0.2;

$sum = $num1 + $num2;
$expected = 0.3;

if (round($sum, 10) == round($expected, 10)) {
    echo "相等";
} else {
    echo "不相等";
}

通过使用round()函数,我们将浮点数保留小数点后的位数,使计算结果更加精确。在这个代码示例中,我们使用round($sum, 10)round($expected, 10)rrreee

Durch die Verwendung der Funktion round() behalten wir die Anzahl der Nachkommastellen in der Gleitkommazahl bei, um das Berechnungsergebnis genauer zu machen. In diesem Codebeispiel verwenden wir round($sum, 10) und round($expected, 10), um die Summe zweier Gleitkommazahlen mit der Genauigkeit zu vergleichen erwarteter Wert, wodurch Ungleichheiten vermieden werden, die durch Präzisionsfehler verursacht werden.

Zusammenfassend lässt sich sagen, dass das Problem des ungleichen Vergleichs von Gleitkommazahlen in PHP hauptsächlich durch die Näherungs- und Präzisionsfehler von Gleitkommazahlen verursacht wird. Beim Vergleich von Gleitkommazahlen sollten wir auf die Genauigkeit achten und versuchen, die direkte Verwendung des Gleichheitszeichens zum Vergleich von Gleitkommazahlen zu vermeiden. Durch einen geeigneten Umgang mit Präzision können wir die Genauigkeit von Gleitkommavergleichen sicherstellen und dadurch die Stabilität und Zuverlässigkeit unserer Programme verbessern.

Ich hoffe, dass die Leser durch die Einführung dieses Artikels ein tieferes Verständnis für die Probleme beim Vergleich von Gleitkommazahlen in PHP erlangen und Fehler vermeiden können, die durch Präzisionsfehler in der tatsächlichen Entwicklung verursacht werden. 🎜

Das obige ist der detaillierte Inhalt vonPHP-Gleitkomma-Dezimalvergleich: Warum nicht gleich?. 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