/ / PHP unerwartetes Ergebnis von float to int Typumwandlung - PHP, Casting, Gleitkomma, Typumwandlung

PHP unerwartetes Ergebnis von float to int type cast - PHP, Casting, Fließkomma, Typumwandlung

Ich "versuche, einen float in einen int - Wert in PHP umzuwandeln:

var_dump((int)(39.3 * 100.0)); //Returns 3929 but should be 3930!
var_dump((int)(39.2 * 100.0)); //Returns 3920

Ich kann ceil verwenden, um es zum Laufen zu bringen, aber kann mir das jemand erklären?

var_dump((int)ceil(39.3 * 100.0)); //Returns 3930

Antworten:

10 für die Antwort № 1

Dies liegt daran, dass Zahlen, die eine endliche Darstellung in der Basis 10 haben, möglicherweise eine genaue Darstellung in der von PHP verwendeten Gleitkommadarstellung haben oder nicht.

Sehen

> php -r echo var_dump (sprintf (%. 40F, 39,3 × 100,0)) Zeichenfolge (45) 3929.9999999999995452526491135358810424804688

Schon seit int Rundet die Zahl immer ab. Ein kleiner Fehler in der Darstellung rundet sie um eine Zahl ab, die Sie sonst erwarten würden.

Überlegen Sie zu verwenden round stattdessen.


3 für die Antwort № 2

Dies könnte zu spät sein, aber der richtige Weg, dies zu tun, ist wie folgt:

(int) bcmul(39.3, 100.0); // 3930
(int) bcmul(39.2, 100.0); // 3920

und für den Umgang mit Ziffern / Berechnungen für Floats oder für alles, was Geldtransaktionen beinhaltet, sollten Sie niemals direkt Multiplikation / Division + Casting verwenden.

Bitte beachten Sie auch dies:

http://php.net/manual/en/book.bc.php

Bemerkung: das Casting in meiner Antwort ist nur, String in Int umzuwandeln (du musst es nicht tun)


1 für die Antwort № 3

Sie sollten sich diese Seite ansehen: http://php.net/manual/en/language.types.float.php. Es beschreibt die Fallstricke beim Arbeiten mit Gleitkommazahlen.


1 für die Antwort № 4
// gives: int(3930)
var_dump(intval((39.3 * 100.0) . ""));

oder zur Verwendung mit einer Funktion:

function floatToInteger ($fValue)
{
return (intval(($fValue + 0) . ""));
}

// gives: int(3930)
var_dump(floatToInteger(39.3 * 100.0));