php float problem, 1-1 = 2.22044604925E-16

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • bonski
    New Member
    • Jun 2007
    • 53

    php float problem, 1-1 = 2.22044604925E-16

    Good day to all,

    Recently I have encountered a problem regarding to float numbers. I have this query that gets the values from database and insert it to an array. These values are decimal (float) numbers. Then basing on these values I have a given value inputted from a textfield, and this given value decrements(subt ract with the values from array) until its last remainder. Here's how it looks like:

    Code:
    //assume that these values are from query to array
    $arr = array(0.2, 0.2, 1, 1, 1, 1, 1 ,1);
    
    //now the given from textfield which creates error
    $given = (float)2.4;
    
    //this loop gets how many values should be needed
    //I dont want to use the whole array values, so I need to check each value that is equal or near to the given value
    
    $check_sum = 0;
    $ctr = 0;
    for ($a=0; $a<sizeof($arr); $a++) {
     $check_sum = $check_sum + $arr[$a];
     if ($check_sum<$given) {
       $ctr++;
       //if sum is less than the given continue on the loop
     } else if ($check_sum==$given) {
       $ctr++; 
       break;
       // if the sum is equal then stop then loop
     } else {
       $ctr++;
       break;
       //as soon as the sum is already more than the given value then stop
     }
    
     //now i have figure out the length of my array to be use
     for ($i=0; $i<$ctr; $i++) {
      if ($given>$arr[$i]) {
        
        $answer = $given - $arr[$i];
        echo $given.' - '.$arr[$i].' = '.$answer.'<br />';
        //decrements 
        $given = $given - $arr[$i];
      } else if ($given == $arr[$i]) {
        // if both equal, the loop ends, should display $answer = 0
        echo $given.' - '.$arr[$i].' = '.$answer.'<br />';
      } else {
        //if given is less than the value from array, get the excess value
        $excess = $arr[$i] - $given
        echo $arr[$i].' - '.$given.' = '.$excess.'<br />';
      }
    }
    
    //so the output should be
    //2.4-0.2 = 2.2
    //2.2-0.2 = 2
    //2-1 = 1
    //1-1 = 0
    
    //but instead, it outputs like this
    //2.4-0.2 = 2.2
    //2.2-0.2 = 2
    //2-1 = 1
    //1-1 = 2.22044604925E-16
    So now, I know the script is ok.. but why 2.22044604925E-16 instead of zero? I hope someone can give me a clarification so I can revise to this one and prevent the float(2.2204460 4925E-16) to come out, but instead the 0.

    Thanks. =)
  • bonski
    New Member
    • Jun 2007
    • 53

    #2
    Hi all, nevermind this.. problem solve, instead of this, i multiple each values with 1000.. coz these values are units in kilograms.. then i converted it into grams.. coz they said 1-1 in float will result to some bug.

    thanks

    Comment

    Working...