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 № 1Dies 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));