PHP中如何正确累加双精度数值?循环内小时数累加异常问题排查
问题分析与解决方案
兄弟,你的累加逻辑犯了两个关键错误,导致最终的周总时长计算完全不对,咱们来一步步拆解:
核心错误点
累加逻辑完全写错
你写的$weekuren = $uren += $uren;这行代码根本不是累加,而是把$uren的值直接翻倍($uren += $uren等价于$uren = $uren * 2),然后把这个翻倍后的值赋值给$weekuren。比如第二次循环时$uren是3.98,执行这行后$uren变成7.96,$weekuren也跟着变成7.96,这就是你最后看到奇怪值的直接原因。累加变量初始化错误
你在循环内部每次都从数据库读取$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
相关产品推荐
相关产品推荐

