Heim  >  Artikel  >  Backend-Entwicklung  >  Vergleichsmethode für PHP-Gleitkommazahlen

Vergleichsmethode für PHP-Gleitkommazahlen

尚
nach vorne
2020-03-25 09:20:513989Durchsuche

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)   
?>

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 >, 95ec6993dc754240360e28e0de8de30a= 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);  
}



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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:oschina.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen