我继承了一个用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适用于将来偶然发现此事的任何人。
答案 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 . " | ";
}
}