2017-02-07 5 views
0

Ich versuche, 2 Werte in PHP zu vergleichen.PHP - Seltsames Ergebnis beim Vergleich von 2 Float-Werten

Meine Logik ist:

  1. Ich habe eine Restmenge (a)
  2. Ich habe eine Menge aufgeladen werden (b)
  3. I durch (a - b) berechnet werden verbleibenden
  4. Nach Ladevorgang erhalte ich den tatsächlichen Restwert (c)
  5. ich den Wert I in # bekam vergleichen 3 mit (c)

Obwohl beide ähnlich sind, sagt PHP, dass sie nicht gleich sind.

unten ist mein Code (gefüllt mit Werten)

<?php 
$remaining_amount_before_payment = "600"; 
$remaining_amount_after_payment = (float)$remaining_amount_before_payment - (float)"387.60"; 
$actual_remaining_amount_after_payment = "212.4"; 
echo "actual_remaining_amount_after_payment: {$actual_remaining_amount_after_payment} <br><br>"; 
echo "remaining_amount_after_payment: {$remaining_amount_after_payment} <br><br>"; 
var_dump(((float)$actual_remaining_amount_after_payment) == ((float)$remaining_amount_after_payment));?> 

Typ I, die Werte zu float werfen, aber die var_dump kehrt FALSE.

Kann mir jemand helfen, herauszufinden, warum das so ist?

Ich benutze PHP 5.6.

Vielen Dank im Voraus!

+1

a) Warum schreiben Sie Ihre Zahlen als Strings an erster Stelle? Es gibt absolut keinen Grund, das jemals zu tun. b) wissen Sie, dass Gleitpunktarithmetik * nicht * genau ist? weißt du und hast den [Gleitkomma-Guide] (http://floating-point-gui.de/) gelesen? c) und wie du selbst gesagt hast: "Obwohl beide ähnlich sind, sagt PHP, dass sie nicht gleich sind." - Sie wissen, dass "ähnlich" und "gleich" nicht gleich sind? ;) –

+0

Weil die tatsächlichen Werte, die ich bekomme, von einer API kommen und sie als Zeichenfolgen kommen! Deshalb habe ich sie auf "float" geworfen, da ich keine Kontrolle über die API-Antwort habe! Ich wusste nicht über den Punkt (b) Sie sagten. Ist es nicht gut, 'float' zu verwenden, um Cast zu schreiben? – masterFly

Antwort

0

Verwenden var_dump (abs (floatval ($ actual_remaining_amount_after_payment) == floatval ($ remaining_amount_after_payment)) == 0);

0

Bingo!

Nach mehreren Versuchen fing ich den Haken. Ich wurde verrückt.

Das "Problem" ist innerhalb der rechten Rundungswerte

$remaining_amount_before_payment = floatval("600"); // use floatval istead of (float) 
$remaining_amount_after_payment = round($remaining_amount_before_payment - floatval("387.60"), 2);// use floatval istead of (float) and round result 
$actual_remaining_amount_after_payment = floatval("212.4");// use floatval 
echo "actual_remaining_amount_after_payment: {$actual_remaining_amount_after_payment} <br><br>"; 
echo "remaining_amount_after_payment: {$remaining_amount_after_payment} <br><br>"; 

var_dump($actual_remaining_amount_after_payment === $remaining_amount_after_payment); // return TRUE 

Example

Voilà!

0

momentan eingestellten Ihre Variable '$ remaining_amount_after_payment' ist nicht wirklich 212,4

einen var_export verwenden, um seinen Wert zu bestimmen. In meiner Sorge, sollten Sie Ihre Schwimmer Werte auf eine Genauigkeit "runden". round(x, precision) zum Vergleich

Verwandte Themen