Vergleichsmethode für PHP-Gleitkommazahlen

Freigeben: 2023-04-08 13:38:02
nach vorne
3999 Leute haben es durchsucht

Vergleichsmethode für PHP-Gleitkommazahlen

Es gibt ein Sprichwort im PHP-Handbuch: Vergleichen Sie niemals zwei Gleitkommazahlen auf Gleichheit.

Die Art und Weise, wie Gleitkommazahlen intern von Computern verarbeitet werden, führt dazu, dass Gleitkommazahlen nicht 100 % genau sein können, sodass es bei der Verarbeitung von Gleitkommazahloperationen zu einem Präzisionsverlust kommt. Zum Beispiel das folgende Programm:

<?php  
$a   =   15521.42;  
$b   =   15480.3;  
$c = $a-$b;  
var_dump($c);    //php4:float(41.120000000001)   php5:float(41.12)   
var_dump($c == 41.12);     //bool(false)   
?>
Nach dem Login kopieren

Die erste Ausgabeanweisung: Unter PHP4 kann die Ausgabe $c 41.120000000001 oder ähnliche Ergebnisse sein, und die folgende 1 ist Teil des Präzisionsverlusts. In PHP5 wurden einige „Optimierungen“ an diesem Problem vorgenommen. Der ungenaue Teil wird nicht in den Ausgabeergebnissen angezeigt, aber gleichzeitig ignorieren wir dieses Problem und gehen davon aus, dass $c==41,12.

Die zweite Ausgabeanweisung: false wird in PHP4 und PHP5 ausgegeben.

Ein Hinweis zum Haftungsausschluss: Dies ist kein PHP-Problem, sondern ein Problem mit der internen Verarbeitung von Gleitkommazahlen durch den Computer! Das gleiche Problem tritt in C/JAVA auf.

Erweiterung: Wir können >, <, >= oder <= auch nicht verwenden

Wie sollen wir also zwei Gleitkommazahlen auf Gleichheit vergleichen?

Nachdem wir die obige Einleitung gelesen haben, wissen wir: Es gibt keine Möglichkeit, zwei Gleitkommazahlen genau auf Gleichheit zu vergleichen! Wir können also nur innerhalb des gewünschten Genauigkeitsbereichs vergleichen (im obigen Beispiel müssen wir beispielsweise nur $c vergleichen, um innerhalb von zwei Dezimalstellen gleich 41,12 zu sein).

Das Folgende ist ein Beispiel aus den PHP-Handbuchkommentaren

nction floatcmp($f1,$f2,$precision = 10) {// are 2 floats equal   
    $e = pow(10,$precision);  
    $i1 = intval($f1 * $e);  
    $i2 = intval($f2 * $e);  
    return ($i1 == $i2);  
}  
function floatgtr($big,$small,$precision = 10) {// is one float bigger than another   
    $e = pow(10,$precision);  
    $ibig = intval($big * $e);  
    $ismall = intval($small * $e);  
    return ($ibig > $ismall);  
}  
function floatgtre($big,$small,$precision = 10) {// is on float bigger or equal to another   
    $e = pow(10,$precision);  
    $ibig = intval($big * $e);  
    $ismall = intval($small * $e);  
    return ($ibig >= $ismall);  
}
Nach dem Login kopieren



Verwandte Empfehlungen:

PHP-Video-Tutorial :https://www.php.cn/course/list/29/type/2.html

Das obige ist der detaillierte Inhalt vonVergleichsmethode für PHP-Gleitkommazahlen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:oschina.net
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!