没有不值得去解决的问题,也没有不值得去学习的技术!

设计一个高精度加法的函数,支持长数字相加不损失精度,忽略负数(请不要使用 bcadd 等自带函数)

bcadd — 两个任意精度数字的加法计算

作者:

, ,
1、最近几天,在机试时候的一个面试题,设计一个高精度加法的函数,支持长数字相加不损失精度,忽略负数(请不要使用 bcadd 等自带函数)。 2、查看 PHP 官网,bcadd — 两个任意精度数字的加法计算。如图1
bcadd — 两个任意精度数字的加法计算
图1
3、最终实现代码如下,期待于后续有时间后继续完善,现阶段对于请求参数的容错处理上做得还不够,且不支持负数
<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>
4、64474.47265 与 24562.45124 相加,运行结果等于:89036.92389,符合预期。  

需要长期技术维护或远程问题排查?

我是拥有 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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理