52、PHP 原生魅力 - 数字 - 四舍五入
使用 round()
函数舍入数字
round()
函数是一个功能强大的工具,使你能够将浮点数舍入到最接近的整数或指定的小数位数。
round()
函数接受三个参数:要舍入的数字,可选的,要舍入到的小数位数,以及舍入小数的方式和逻辑。如果第二个参数被省略, round()
将四舍五入到最接近的整数。
<?php
$number = 3.76;
$rounded = round($number);
echo $rounded . PHP_EOL;
输出如下:
$ php 52-round.php
4
在上面使用 round 而不使用第二个参数的示例中,十进制数 3.76
被舍入为最接近的整数,因此 4.0
。
<?php
$number = 3.76;
$rounded = round($number, 1);
echo $rounded . PHP_EOL;
输出如下:
$ php 52-round.php
3.8
在上面使用 1
作为精度数(第二个参数)的示例中,返回的数字(具有1个精度位的最近数字)是 3.8
。
如果你想舍入的数字在中间,例如 3.5
,你想以 0
位作为精度舍入,怎么办?在这种情况下,您可以使用 round()
函数的第三个参数,该参数允许您确定想要舍入数字的方式。
舍入模式
在 PHP 中使用 round()
函数时,可以通过提供以下常量之一作为第三个参数来指定舍入模式:
-
PHP_ROUND_HALF_UP
:此模式在数字到达一半时将其从零舍入。例如,3.5
变成3.0
,-3.5
变成-4.0
。<?php $number = 3.5; $rounded = round($number, mode: PHP_ROUND_HALF_UP); echo $rounded . PHP_EOL;
输出如下:
$ php 52-round.php 4
-
PHP_ROUND_HALF_EVEN
:在这里,数字在一半时向最近的偶数值舍入。这意味着3.5
和4.5
都变成了4.0
。<?php $number = 3.5; $rounded = round($number, mode: PHP_ROUND_HALF_EVEN); echo $rounded . PHP_EOL; $number = 4.5; $rounded = round($number, mode: PHP_ROUND_HALF_EVEN); echo $rounded . PHP_EOL;
输出如下:
$ php 52-round.php 4 4
-
PHP_ROUND_HALF_ODD
:在这种模式下,数字在一半时会向最近的奇数舍入。3.5
变成3.0
,2.5
变成3.0
。<?php $number = 3.5; $rounded = round($number, mode: PHP_ROUND_HALF_ODD); echo $rounded . PHP_EOL; $number = 4.5; $rounded = round($number, mode: PHP_ROUND_HALF_ODD); echo $rounded . PHP_EOL;
输出如下:
$ php 52-round.php 3 5
这些模式提供了如何舍入数字的灵活性,允许您选择最适合您特定需求的舍入行为
注意:
舍入浮点数时可能发生的潜在错误通常称为舍入误差或累积舍入误差。当顺序执行多个舍入操作时,会出现累积舍入误差,导致精确数学结果与舍入值之间存在累积差异。在所提供的示例中:
$result = (1/3) + (1/3) + (1/3);
// result 1.0
$result = round(1/3,3) + round(1/3, 3) + round(1/3,3);
// result 0.999
每个除法结果(
1/3
)四舍五入到小数点后三位,得到近似值0.333
。当这些舍入值相加在一起时,累积的舍入误差可能导致最终结果与精确的数学结果略有不同。在这种情况下,由于累积的舍入误差,舍入值(
0.333
+0.333
+0.333
)的和可能不精确地等于1.0
。
精密度
如前所述, round()
函数的第二个参数是precision。当精度参数为负数时,它定义小数点前的有效位数,该数字将舍入到该小数点。例如,如果精度为 -1
,则数字将四舍五入到最接近的十的倍数(十位)。 234.56
变成了 230
。精度为 -2
时,它被四舍五入到最接近的100的倍数(百位),使 234.56
变成 200.0
。类似地,在精度为 -3
的情况下,它被四舍五入到最接近的千位(千位),使 234.56
变成 0.0
。