2017-04-05 8 views
0

Ich habe eine Zeichenfolge "65.57". Ich brauche die int 6557Odd Casting Verhalten

Allerdings bekommen ...

(int) (((float) "65.57") * 100) === 6556

Seltsam, wenn aufgebrochen, alles wie erwartet funktioniert:

((float) "65.57") * 100) === 6557.0

und

(int) 6557.0 === 6557

aber wenn ich inline bin, bekomme ich 6556.

+0

'Echo serialize ((float) "65,57" * 100);' wirft es in einen int und es kürzt gerade. Sie könnten runden, aber sollten Sie hier nicht schwimmen. – AbraCadaver

+0

Die Antwort, warum dies geschieht, finden Sie im zweiten Abschnitt des Themas "Warnung Fließkomma-Genauigkeit" auf [dieser Seite] (http://php.net/manual/en/language.types.float.php#warn.float -precision) – DFriend

+0

["Nie einen unbekannten Bruch in einen Integer werfen"] (http://us2.php.net/manual/en/language.types.integer.php#language.types.integer.casting) String-Manipulation fühlt sich an wie ein Overkill (für mich). Sie könnten stattdessen "Runde" verwenden. – csirmazbendeguz

Antwort

1

Nicht mit Schwimmern durcheinander bringen, sie werden dir nur Schmerzen bringen. :)

Ich hatte gerade den Punkt Streifen aus:

$s = '65.57'; 
$x = str_replace('.', '', $s); 

Wenn Sie tatsächlich einen int benötigen, dann das Ergebnis werfen:

$x = (int) str_replace('.', '', $s); 
+0

Ja, ich dachte daran, diesen Weg zu gehen. Ich fand es wirklich merkwürdig, dass ich, wenn ich inline bin, ein Ergebnis bekommen habe, und wenn ich in separate Aussagen aufgeteilt habe, habe ich das erwartete Ergebnis bekommen ... – Ben

0

Wie Alex sagte

Leg dich nicht mit Schwimmern an, sie werden dir nur Schmerz bringen. :)

function parsePrice($str) { 
    $parts = explode('.', $str); 
    return intval($parts[0]) * 100 + intval($parts[1]); 
} 

var_dump(parsePrice('65.57')); 

// Output: int(6557) 
0

Sie haben auf einem Floating-Point-Ungenauigkeit Problem gestolpert.

Das Problem ist, dass Gleitkommazahlen immer eine Anzahl von Dezimalstellen haben, und manchmal eine Anzahl von Dezimalstellen vor Ihnen verborgen sind. Aus diesem Grund werden Sie hin und wieder nicht immer miteinander multiplizieren, wie Sie erwarten.

Der wahre Grund liegt in der binären, wir sind zu einem Zehn-Basen-Zahlensystem gewöhnt. genauso wie wir nicht perfekt beschreiben können 1/3 (~ 0.3333333333 ..) Binär kann nicht immer unsere "perfekt feine Dezimalzahlen" in 10-Base, können Sie die Genauigkeit PHP verwendet, um Floats mit in Ihrer php.ini berechnen berechnen . Aber Sie würden viel besser mit Floats umgehen und Ihre Berechnungen mit ganzen Zahlen machen.

Mehr zum Thema:

Floating point inaccuracy examples

Can I rely on PHP php.ini precision workaround for floating point issue