php中使用 round() 函数进行四舍五入并保留小数,核心是传入第二个参数 $precision 指定保留位数。该函数默认采用“四舍六入五成双”(银行家舍入法),即当要舍弃部分恰好为5时,会向最近的偶数靠拢,这与传统数学中的“四舍五入”略有不同。若需严格遵循传统四舍五入,可结合 sprintf() 或自定义逻辑处理。

round() 的默认行为与精度控制
round() 函数的标准调用方式为 round(float $num, int $precision = 0)。第一个参数是要处理的数值,第二个参数决定小数点后保留几位。例如 round(3.14159, 2) 返回 3.14。其内部实现基于 IEEE 754 浮点数运算,因此在处理特定边界值(如 x.xx5)时,结果可能符合银行家舍入规则而非传统规则。

<?php $num = 2.5; echo round($num); // 输出 2 (银行家舍入: 2是偶数) echo round(3.5); // 输出 4 (银行家舍入: 4是偶数) echo round(1.25, 1); // 输出 1.2 (保留1位, 5前是2偶数) echo round(1.35, 1); // 输出 1.4 (保留1位, 5前是3奇数) ?>
如何实现传统的“四舍五入”
如果业务场景严格要求“只要第N+1位大于等于5就进位”,可以使用 sprintf() 配合格式化字符串,或者使用 bcadd() 等高精度数学函数。对于大多数常规场景,sprintf("%.2f", $value) 能更直观地体现传统舍入效果,但需注意它返回的是字符串类型。
立即学习“PHP免费学习笔记(深入)”;

<?php
$value = 1.255;
// 传统四舍五入到2位小数
$result = sprintf("%.2f", $value);
echo $result; // 输出 1.26 (传统规则)
// 对比 round() 的行为
echo round($value, 2); // 输出 1.25 (银行家舍入)
// 使用 bcmath 确保高精度和传统舍入
$precise = bcadd($value, '0', 2);
echo $precise; // 输出 1.26
?>
浮点数精度导致的意外结果
由于计算机二进制表示浮点数的局限性,某些十进制小数无法精确存储。这会导致 round() 在处理看似整齐的数值时产生微小偏差。例如 0.575 在内存中可能略小于实际值,导致 round(0.575, 2) 结果为 0.57 而非预期的 0.58。解决此问题通常建议在计算过程中使用整数运算,或在最终展示时使用 bcmod() 或 sprintf() 进行格式化输出,避免直接依赖 round() 处理金融级精度数据。



















