PHP学习手册二:PHP 的float类型的奇葩事

看手册时上面说,由于计算机内容对浮点型处理方式的原因,会造成数据精度的定时,因此永远不要比较两个浮点数是否相等。这怎么可能呢,怎么可能不会遇到比较浮点数字的问题呢?于是自己测试了下:

echo  1.2565895895 == 1.2565895895;

心想不是说精度会丢失么,就故意写个小数位多的数来比较,发现输出的结果是:1。这精度没丢失啊,怎么?手册写错了?不可能,于是再试一个:

if((0.1+0.7) == 0.8){
    echo "相等";
}else{
    echo "不相等";
}

我*,结果竟然输出的是"不相等",精度真的丢失了。什么情况?原来只是在运算的结果是float类型时比较会产生这种现象。那该怎么比较两个float的大小呢,手册给出了一个函数:

int bccomp ( string $left_operand , string $right_operand [, int $scale = int ] )

left_operand 
左边的运算数, 是一个字符串. 

right_operand 
右边的运算数, 是一个字符串. 

scale 
可选的scale参数被用作设置指示数字, 用来指定比较多少位小数. 

返回值
如果两个数相等返回0, 左边的数left_operand比较右边的数right_operand大返回1, 否则返回-1. 



用这个函数来处理:

if(bccomp((0.1+0.7),0.8)==0){
    echo "相等";
}else{
    echo "不相等";
}

这个时候输出的就是"相等"了。

那么再来试一个:

echo bccomp(1.2566895895,1.2565895895);

注意,这两个数是不相等的,但结果输出的是 0,也就是相等。这怎么又出问题了呢,这个时候就用到了第三个参数,指定下比较到指定位数的小数,比如,这两个小数只有第小数点后第4位不同,那就设置为4或者5来试试:

ho bccomp(1.2566895895,1.2565895895,5);

这个时候输出的就是 1了,也就是左边的比右边的大。

小小的float,坑还真不少啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P P PHP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值