php 简单的加法和减法不能正确工作

2eafrhcq  于 2023-02-28  发布在  PHP
关注(0)|答案(3)|浏览(199)

我继承了一个用PHP编写的项目,它有一个复式现金簿,要求进出的金额相等。
当验证通过表单输入的数字时(计算它是否等于零),它运行下面的代码,直到出现一个十进制数字,这似乎使它随机下降并返回一个不正确的值。
在下面的例子中,它返回了一个非常小的数字53.87 - 53.87,应该是零,这个数字已经被去除了,以消除其他因素造成的问题,所以我已经删除了很多输入验证等。

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

您可以在沙箱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为任何人谁在这方面跌倒在未来。

2guxujil

2guxujil1#

这是因为计算机喜欢二进制数学的浮点(十进制)数学,有时十进制数在二进制中没有很好的表示,所以会出现这些微小的差异。
如果你可以声明每个数字都可以四舍五入到2个小数点,并且基于你有限的数据集,用number_format($fTotal + $amountIn , 2)等 Package 你的“总和”可以为你解决这个问题。
或者,为了“更准确”,只需 Package 最后一个,例如echo "'".number_format($fTotal, 2)."' | ";(或0或其他)

pepwfjgg

pepwfjgg2#

您的数字被解释为字符串。
试试这个:

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

}
izkcnapc

izkcnapc3#

PHP中的bcsub()函数是一个内置函数,用于从一个任意精度数中减去另一个。
语法:string bcsub ( $num_str1, $num_str2, $scaleVal)
示例:<?php $num_str1 = "8"; $num_str2 = "3"; $res = bcsub($num_str1,$num_str2)echo $res; ?>结果:
5

相关问题