【发布时间】:2016-04-18 13:20:06
【问题描述】:
我继承了一个用 PHP 编写的项目,它有一个复式式现金簿,它要求输入的金额等于输出的金额。
当验证通过表单输入的数字时(计算它是否等于 0),它会运行下面的代码,该代码可以正常工作,直到出现一个十进制数字,这似乎使它随机翻倒并返回一个不正确的值。
在下面的示例中,它返回一个非常小的数字,从 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 供将来偶然发现此问题的任何人使用。
【问题讨论】:
标签: php math addition subtraction