在php语言中,两个浮点数float怎样比较大小?

原创 PHP笔记  2017-03-15 18:58  阅读 3,535 views 次

学习php好久了,最近我才知道两个浮点数不能比较大小,于是上百度搜了搜,总结了几种比较浮点数的方法,供大家参考。
var_dump/echo/print直接输出浮点数是看不出效果的,我们可以在输出的时候使用serialize()就可以看出浮点数的“真身”。

实例1:

<?php
$a=0.4-0.3;
echo $a,"<br/>";
echo serialize($a);
?>

输出结果:

0.1

d:0.100000000000000033306690738754696212708950042724609375;

分析:根据上面的例子,我们可以得出0.4-0.3是不等于0.1的,如果拿0.4-0.3和0.1比较是不相等的,那到底是这样吗?哪得用事实说话。

实例2:

<?php
$a=0.4-0.3;
$b=($a==0.1);/*比较0.4-0.3是否等于0.1,等于返回true ,不等于返回false*/
var_dump($b);//输出$b的类型和值
?>

输出结果:boolean false

分析:通过上例,0.4-0.3确实不等于0.1,但众所周知,0.4-0.3是等于0.1的,这不是矛盾了吗?通过上网查询才知道,原来浮点数是不精确的,是不能比较大小的。那我们怎样才能比较浮点数呢?

方法一:

浮点数一般是不能比较大小的,但是我们可以用一种变通的的方式,我们可以使用string来强制转换成字符串型再比较。

实例:

<?php
$a=0.4-0.3;
$b=((string)$a==0.1);
var_dump($b);
?>

输出结果:boolean true

方法二:

通过round(x,prec);函数来处理后比较。函数将返回将 x 根据指定精度 prec (十进制小数点后数字的数目)进行四舍五入的结果。prec 也可以是负数或零(默认值)。

实例:

<?php
$a=0.4-0.3;
$b=(round($a,1)==0.1);/*round(x,prec),x:可选,规定要舍入的数字。prec:可选,规定小数点后的位数。*/
var_dump($b);
?>

输出结果:boolean true

总结:两个浮点型的数一般不直接比较大小,都是先通过转换或特殊的处理后才比较。

本文地址:https://www.ggbiji.com/php-float.html
版权声明:本文为 PHP笔记 原创/整理文章,欢迎分享,转载请注明出处!

发表评论


表情