简单的加法和减法无法正常工作

时间:2016-04-18 13:20:07

标签: php math addition subtraction

我继承了一个用PHP编写的项目,该项目有一个双重入门式现金簿,要求进入的金额等于出金额。

当验证通过表单输入的数字时(如果它等于零则计算出来),它运行下面的代码,该代码正常工作,直到有一个十进制数,这似乎使它随机翻倒并返回一个不正确的值。 / p>

在下面的例子中,它返回一个非常小的数字,从53.87 - 53.87,应该是零。这已被剥离以消除其他因素导致问题,所以我删除了很多输入验证等。< / p>

MultithreadedMapper

您可以在沙箱here上运行此功能。

这是预期的输出:

  

从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'|

以下是实际输出:

  

从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'|

这里有什么问题?

更新

以下帮助,here's the working code适用于将来偶然发现此事的任何人。

2 个答案:

答案 0 :(得分:1)

这是因为浮点(十进制)数学,其中计算机就像二进制数学。有时十进制数字在二进制中没有很好的表示,所以这些微小的差异就会发生。

如果您可以声明每个数字可以舍入到2个小数点,并且根据您的有限数据集,将{sums'包装在number_format($fTotal + $amountIn , 2)等中可以为您排序。

或者对于“更准确”,只需包装最后一个例如。 echo "'".number_format($fTotal, 2)."' | ";(或0或其他)

答案 1 :(得分:0)

您的号码被解释为字符串。

试试这个:

<?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 . "  |  ";
    }

}