2016-04-18 15 views
0

Ich habe ein in PHP geschriebenes Projekt geerbt, das ein Kassenbuch mit doppeltem Eintrag hat, das erfordert, dass der Betrag, der eingeht, dem ausgehenden Betrag entspricht.Einfache Addition und Subtraktion funktioniert nicht richtig

Bei der Validierung von Zahlen, die über ein Formular eingegeben wurden (um herauszufinden, ob es gleich Null ist), wird der folgende Code ausgeführt, bis eine Dezimalzahl erscheint, die einen zufälligen Wert anzeigt.

Im folgenden Beispiel gibt es eine wirklich winzige Zahl von 53,87 - 53,87, die Null sein sollte. Diese wurde entfernt, um andere Dinge davon abzuhalten, Probleme zu verursachen, also habe ich eine Menge der Eingangsvalidierung entfernt usw.

<?php $inputs = array(
    array(
     "in" => '', 
     "out" => '249.6', 
    ), 
    array(
     "in" => '', 
     "out" => '396', 
    ), 
    array(
     "in" => '554.4', 
     "out" => '' 
    ), 
    array(
     "in" => '145.07', 
     "out" => '' 
    ), 
    array(
     "in" => '', 
     "out" => '53.87', 
    ), 
); 
$fTotal = 0; 
echo "Start at 0: "; 
foreach($inputs as $key=>$sRef) { 
    $itemValid = true; 
    $aItem = array(); 
    $amountIn = $inputs[$key]['in']; 
    $amountOut = $inputs[$key]['out']; 
    if ($itemValid) { 
     echo "'".$fTotal."'"; 
     $is_in = 0; 
     if ($amountIn > 0.0) { 
      $is_in = 1; 
      echo "+"; 
      $amount = $amountIn; 
      $fTotal = $fTotal + $amountIn; 
     } else { 
      $is_in = 0; 
      echo "-"; 
      $amount = $amountOut; 
      $fTotal = $fTotal - $amountOut; 
     } 
     echo "'".$amount."'="; 
     echo "'".$fTotal."' | "; 
     $aItem["is_in"] = $is_in; 
     $aItem["amount"] = $amount; 
     $aItems[] = $aItem; 
    } 
} 

Sie können diese here auf einer Sandbox ausgeführt. Hier

ist die erwartete Ausgabe:

Start bei 0: 0 '- '249.6'= '- 249.6' | '-249.6' - '396' = '- 645.6' | '-645.6' + '554.4' = '- 91.2' | '-91.2' + '145.07' = '53.87' | '53 .87 '-' 53.87 '=' 0 '| Hier

ist die tatsächliche Ausgabe:

Start bei 0: 0 '- '249.6'= '- 249.6' | '-249.6' - '396' = '- 645.6' | '-645.6' + '554.4' = '- 91.2' | '-91.2' + '145.07' = '53.87' | '53 .87 '-' 53.87 '=' - 4.9737991503207E-14 '|

Was ist hier falsch?

aktualisieren

Nach Hilfe unten, here's the working code für alle, die in Zukunft auf diese stolpert.

Antwort

1

Dies wegen Gleitkomma (dezimal) geschieht Mathematik, in den Computern wie binäre Mathematik. Manchmal haben Dezimalzahlen keine schöne binäre Darstellung, so dass diese kleinen Unterschiede auftreten.

Wenn Sie angeben können, dass jede Zahl auf 2 Dezimalstellen gerundet werden kann, und basierend auf Ihrem begrenzten Dataset, können Sie Ihre "Summen" in number_format($fTotal + $amountIn , 2) etc für Sie sortieren.

Alternativ für eine "genauere", einfach wickeln Sie die endgültige z. echo "'".number_format($fTotal, 2)."' | "; (oder 0 oder was auch immer)

0

Ihre Zahlen werden als Strings interpretiert.

Try this:

<?php 
$inputs = array(
    array(
     "in" => 0, 
     "out" => 249.6, 
    ), 
    array(
     "in" => 0, 
     "out" => 396, 
    ), 
    array(
     "in" => 554.4, 
     "out" => 0 
    ), 
    array(
     "in" => 145.07, 
     "out" => 0 
    ), 
    array(
     "in" => 0, 
     "out" => 53.87, 
    ), 
); 

$fTotal = 0; 

echo "Start at 0: "; 
foreach($inputs as $key => $sRef) { 
    $itemValid = true; 

    $amountIn = $sRef['in']; 
    $amountOut = $sRef['out']; 

    if ($itemValid) { 

     echo $fTotal; 

     $is_in = 0; 
     if ($amountIn > 0.0) { 

      $is_in = 1; 

      echo "+"; 

      $amount = floatval($amountIn); 
      $fTotal = floatval($fTotal) + floatval($amountIn); 

     } else { 

      $is_in = 0; 

      echo "-"; 

      $amount = floatval($amountOut); 
      $fTotal = floatval($fTotal) - floatval($amountIn); 

     } 

     echo $amount; 
     echo ' = ' . $fTotal . " | "; 
    } 

}