Überraschend float-int-Umwandlung in PHP

Nachdem er eine Stunde versucht, herauszufinden, warum ein PHP-Skript gab mir falsche Ausgabe, es stellte sich heraus, dass eine Schleife lief eine iteration kurzen in einem bestimmten Fall.

Um zu erklären, was Los ist: eine version-Nummer (2-stellig, z.B. 1.5 oder 2.0) Lesen aus einer XML-Attribut und mit 100 multipliziert. Das Skript später durchläuft einen definierten Bereich der versions-Nummer gruppiert.

Es stellt sich heraus, dass 410 == 409 gibt, die eine lustige überraschung, wenn Sie vergleichen einen Zähler, der inkrementiert in Schritten von 10 gegen diesen Wert.

Das bringt mich zu meiner Frage: Bin ich grundsätzlich Verständnis etwas falsch? Sicherlich 4.1, 100, und 410 sollten alle gut darstellbar, wie float-und sollte auch-Cabrio zu int ohne Rundungsfehler?

Jedoch auf meinem system (mit PHP-CLI 5.3.2, Zend Engine 2.3.0), der folgende Testfall

<?
$a = 100 * 4.1;
$b = (string) $a;
$c = (int) $a;
$d = (int)(string) $a;

var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
?>

Ausgänge:

float(410)
string(3) "410"
int(409)
int(410)

Ich bin jetzt dabei einen (int)(string) Bekehrung, die funktioniert, aber dies ist eine Art von einem fiesen hack, der nicht hübsch ist und nicht ganz im Recht fühlen.

Gibt es eine bessere (richtige, kein hack) Lösung, um ein genaues Resultat?

  • mögliche Duplikate von PHP Typisierung float->int
  • 0,1 oder 1/10, ist nicht ausdrückbar ist genau in der Binärdatei. Eher wie 1/3 im Dezimalsystem.
InformationsquelleAutor Damon | 2011-04-13
Schreibe einen Kommentar