0

I'm trying to minus 119.7 from 119.7 using PHP but the result is not expected (-1.4210854715202E-14), the expected result is 0

  1. Doc1 RestToPay = 171
  2. Doc2 RestToPay = 119.7

Here is my code:

$TotalAmountToPay = 290.7;
foreach($Docs as $Doc){
    $RestToPay = $Doc['RestToPay'];
    if($TotalAmountToPay <= 0){
        break;
    }
    $TotalAmountToPay = $TotalAmountToPay - $RestToPay;
    if($TotalAmountToPay >= 0){
        echo "OK: ".$TotalAmountToPay;
    }else{
        echo "Done: ".$TotalAmountToPay;
    }
}

Output I have got:

  • OK: 119.7
  • Done: -1.4210854715202E-14
  • 1
    You should also read [What Every Computer Scientist Should Know About Floating-Point Arithmetic](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – M. Eriksson Jan 05 '22 at 12:02
  • The usually recommended way to avoid this issue is to work in pennies instead; 29070 rather than 290.70; the decimal point is only added just before showing the result to the user – Jiří Baum Jan 05 '22 at 12:09

2 Answers2

1

It should help.

$TotalAmountToPay = 290.7;
foreach($Docs as $Doc){
    $RestToPay = $Doc['RestToPay'];
    if($TotalAmountToPay <= 0){
        break;
    }
    $TotalAmountToPay = round($TotalAmountToPay,2) - round($RestToPay,2);
    if($TotalAmountToPay >= 0){
        echo "OK: ".$TotalAmountToPay;
    }else{
        echo "Done: ".$TotalAmountToPay;
    }
}
lazyme114
  • 199
  • 2
  • 16
0

It seems like some type of way those numbers are being stored and converted are not equal. You could always use the round() function which should get you what you want. So maybe try this:

$TotalAmountToPay = 290.7;
foreach($Docs as $Doc){
    $RestToPay = $Doc['RestToPay'];
    if($TotalAmountToPay <= 0){
        break;
    }
    $TotalAmountToPay = $TotalAmountToPay - $RestToPay;
    if($TotalAmountToPay >= 0){
        echo "OK: ".round($TotalAmountToPay,4);
    }else{
        echo "Done: ".round($TotalAmountToPay,4);
    }
}
John
  • 5,132
  • 1
  • 6
  • 17