首页 > 编程笔记

PHP浮点数以及常见操作

浮点数(float)可以处理带有小数部分的数值。PHP 中的浮点数采用 IEEE 754 标准的双精度格式,使用 64 位存储。

浮点数同样可以进行基本的加、减、乘、除等算术运算,下面的代码演示了相关运算。
<?php
$x = 5.1;
$y = 2.0;
echo "$x + $y = ",$x+$y,"<br>";
echo "$x - $y = ",$x-$y,"<br>";
echo "$x * $y = ",$x*$y,"<br>";
echo "$x / $y = ",$x/$y,"<br>";
echo "$x % $y = ",$x%$y,"<br>";
echo "$x ** $y = ",$x**$y,"<br>";
?>
代码执行结果为:

5.1 + 2.0 = 7.1
5.1 - 2.0 = 3.1
5.1 * 2.0 = 10.2
5.1 % 2.0 = 2.55
5.1 ** 2.0 = 26.01

这里需要注意的是求模(求余数)运算。由于 % 运算符只能用于整数的运算,对于非整数运算数,会转换为整数后再进行计算,所以,5.1%2 的运算结果也就是 5%2 的结果 1。

此外,由于计算机直接处理浮点数的限制,需要高精度的浮点数计算时,应使用 PHP 提供的数学计算函数,下面是 BC 数学库中的一些运算函数:
这些函数中,bcsqrt() 函数用于求平方根,它只需要一个必要的参数,其他的函数都需要两个必要的参数,其中,参数一是左操作数,参数二是右操作数。需要注意的是,这些必要参数都是字符串(string)类型,但实际应用中,直接输入数值也可以自动完成类型转换工作。

此外,bcadd()、bcsub()、bcmul()、bcdiv()、bcpow()、bcpowmod() 和 bcsqrt() 函数的最后一个参数是可选参数,用于指定计算结果中的小数位,默认是 0(只取整数部分)。

下面的代码演示了 bcadd()、bcmod() 和 bcsqrt() 函数的使用。
<?php
echo bcadd("1.23","0.15",2),"<br />";
echo bcmod("1.23","0.15",2),"<br />";
echo bcsqrt("9",2);
?>
代码执行结果为:

1.38
0.03
3.00

BC 数学库中,还可以使用 bccomp() 函数进行指定小数位的数值比较,相等时返回 0,参数一大于参数二时返回 1,参数一小于参数二时返回 -1。

下面的代码演示了 bccomp() 函数的使用。
<?php
$x = "3.001";
$y = "3.0";
echo bccomp($x,$y,3),"<br />";
echo bccomp($x,$y,1),"<br />";
echo bccomp($y,$x,3);
?>
本例,第一个 bccomp() 函数比较三位小数,3.001 的值大于 3.0 的值,结果返回 1;第二个 bccomp() 函数比较 1 位小数,3.0 等于 3.0,结果返回 0;第三个 bccomp() 函数同样比较三位小数,这次将 $y 放在前面,3.0 小于 3.001,结果返回 -1。

一些 BC 数学函数可以设置一个小数位数的参数,如果在一段代码中需要大量使用这些函数,可能会有些麻烦。此时,可以使用 bcscale() 函数,它的功能是设置所有BC数学函数默认的小数位数。

bcscale() 函数只有一个整数参数,用于设置小数位数,如果设置成功,函数会返回 true,否则返回 false。下面的代码演示了 bcscale() 函数和运算函数的配合使用。
<?php
bcscale(3);
echo bcadd("1.12345","3.0056"),"<br />";
echo bcadd("1.12345","3.0056",5);
?>
代码运行结果会显示 4.129 和 4.12905。首先使用 bcscale() 函数设置精度为 3 位小数;第一个 bcadd() 函数中使用了两个参数,它的运算精度就是 3 位小数;第二个 bcadd() 函数中将第三个参数设置为 5,其运算结果就是 5 位小数。

推荐阅读