
<pre class="wp-block-syntaxhighlighter-code">
<?php
function highPrecisionAdd(string $number1, string $number2, $scale = null) {
// 提取出整数与小数
$numArr1 = explode('.', $number1);
$numArr2 = explode('.', $number2);
$result = [];
// 计算小数的最长长度
$decimalMaxLen = max(strlen($numArr1[1]), strlen($numArr2[1]));
// 判断 $scale 是否为 null,如果是,则设置其为结果中小数点后的小数位数
if ($scale === null) {
$scale = $decimalMaxLen;
}
// 删除前导零并反转整数,然后在末尾连接小数
$number1 = strrev(ltrim($numArr1[0], '0') . str_pad($numArr1[1], $decimalMaxLen, '0'));
$number2 = strrev(ltrim($numArr2[0], '0') . str_pad($numArr2[1], $decimalMaxLen, '0'));
// 计算需要处理的最长长度
$maxLen = max(strlen($number1), strlen($number2));
// 填充两个数字,使它们的长度相等(都等于 $maxLen)
$number1 = str_pad($number1, $maxLen, '0');
$number2 = str_pad($number2, $maxLen, '0');
// 处理每个数字,保留个位,携带十位(余数)
for($i = 0; $i < $maxLen; $i++) {
$sum = ((int) $number1[$i] + (int) $number2[$i]);
if (isset($result[$i])) {
$sum += $result[$i];
}
$result[$i] = $sum % 10;
if ($sum > 9) {
$result[$i + 1] = 1;
}
}
// 将数组转换为字符串并将其反转
$result = strrev(implode($result));
// 计算出小数
$decimal = str_pad(substr($result, -$decimalMaxLen, $scale), $scale, '0');
// 计算出整数
$can = (($maxLen - $decimalMaxLen < 1) ? '0' : substr($result, 0, -$decimalMaxLen));
// 拼接整数与小数
$result = $can . (($scale > 0) ? '.' . $decimal : '');
return $result;
}
echo highPrecisionAdd('64474.47265', '24562.45124');
?>
</pre>
需要长期技术维护或远程问题排查?
我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。
如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:
- ✅ PHP / Laravel / Yii2 老项目无人维护
- ✅ Go / Gin 后端接口需要排查或优化
- ✅ WordPress 网站访问慢、报错或插件冲突
- ✅ Nginx / MySQL / Redis / Linux 服务器异常
- ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
- ✅ 需要长期远程技术支持或兼职维护
更多介绍请查看:关于我 & 合作
微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan

发表回复