You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何正确累加双精度数值?循环内小时数累加异常问题排查

问题分析与解决方案

兄弟,你的累加逻辑犯了两个关键错误,导致最终的周总时长计算完全不对,咱们来一步步拆解:

核心错误点

  1. 累加逻辑完全写错
    你写的$weekuren = $uren += $uren;这行代码根本不是累加,而是把$uren的值直接翻倍($uren += $uren等价于$uren = $uren * 2),然后把这个翻倍后的值赋值给$weekuren。比如第二次循环时$uren是3.98,执行这行后$uren变成7.96,$weekuren也跟着变成7.96,这就是你最后看到奇怪值的直接原因。

  2. 累加变量初始化错误
    你在循环内部每次都从数据库读取$d['weekuren']来覆盖$weekuren,但实际上你需要的是一个独立的、用来累加的变量,而不是依赖数据库里的字段。而且这个变量必须在循环开始之前初始化为0,否则第一次累加时会用未定义的空值参与计算,结果肯定不对。

修正后的代码

// 初始化周总时长为0,必须放在循环外面!
$weekuren = 0;
$sq = mysql_query("SELECT * FROM presentielijst ORDER BY datum ASC") or die(mysql_error());
$tel = mysql_num_rows($sq);
echo "<table cellpadding='5' cellspacing='2' border='0' width='100%' style='font-size:14pt'>";
while($d = mysql_fetch_assoc($sq)) {
    $p_id = stripslashes($d['p_id']);
    $weeknummer = stripslashes($d['weeknummer']);
    $dag = stripslashes($d['dag']);
    $datum = stripslashes($d['datum']);
    // 删掉这行!不需要从数据库读取weekuren,我们自己维护累加值
    // $weekuren = stripslashes($d['weekuren']);
    $toelichting = stripslashes($d['toelichting']);
    $kleur = stripslashes($d['kleur']);
    $aanmeldtijd = strtotime($d['aanmeldtijd']);
    $afmeldtijd = strtotime($d['afmeldtijd']);
    $uren = abs($afmeldtijd - $aanmeldtijd) / 3600; 
    $uren = round($uren, 2);
    // 正确的累加方式:把当前计算出的$uren加到周总时长里
    $weekuren += $uren;
    echo "<td class='presentieurentd' width='380px' bgcolor='".$kleur."' onclick=open_gegevens('".$p_id."')>".$uren."</td>";
}
echo "</table>";
// 现在输出的就是正确的累加结果了
echo "周总时长:".round($weekuren, 2);

额外提醒

另外要告诉你,mysql_*系列函数已经在PHP 5.5之后被废弃,PHP 7更是直接移除了这些函数。为了代码的安全性和长期兼容性,建议尽快迁移到mysqli_*或者PDO扩展来操作数据库哦。

内容的提问来源于stack exchange,提问作者stefan86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:27:36