全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

php 浮点数比较方法详解

浮点数运算精度问题

首先看一个例子:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($a+$b)==$c);
var_dump(($c-$b)==$a);
?>

$a+$b==$c 返回true,正确
$c-$b==$a 返回false,错误

为什么会这样呢?

运算后,精度为20位时实际返回的内容如下:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
printf("%.20f", $a+$b); // 1.00000000000000000000
printf("%.20f", $c-$b); // 0.09999999999999997780
?>

$c-$b 为 0.09999999999999997780,因此与0.1比较返回false

出现这个问题是因为浮点数计算涉及精度,当浮点数转为二进制时有可能会造成精度丢失。

浮点数转二进制方法

整数部分采用除以2取余方法

小数部分采用乘以2取整方法

例如:把数字8.5转为二进制

整数部分是8

8/2=4 8%2=0
4/2=2 4%2=0
2/2=1 2%2=0

1比2小,因此不需要计算下去,整数8的二进制为 1000

小数部分是0.5

0.5x2 = 1.0

因取整后小数部分为0,因此不需要再计算下去

小数0.5的二进制为 0.1

8.5的二进制为1000.1

计算数字0.9的二进制

0.9x2=1.8
0.8x2=1.6
0.6x2=1.2
0.2x2=0.4
0.4x2=0.8
0.8x2=1.6

…. 之后不断循环下去,当截取精度为N时,N后的数会被舍去,导致精度丢失。

上例中0.9在转为二进制时精度丢失,导致比较时出现错误。

所以永远不要相信浮点数已精确到最后一位,也永远不要比较两个浮点数是否相等。

正确比较浮点数的方法

1.使用round方法处理后再比较

例子:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($c-$b)==$a);          // false
var_dump(round(($c-$b),1)==round($a,1)); // true
?>

2.使用高精度运算方法

首先进行运算时,使用高精度的运算方法,这样可以保证精度不丢失。

高精度运算的方法如下:

bcadd 将两个高精度数字相加

bccomp 比较两个高精度数字,返回-1,0,1

bcdiv 将两个高精度数字相除

bcmod 求高精度数字余数

bcmul 将两个高精度数字相乘

bcpow 求高精度数字乘方

bcpowmod 求高精度数字乘方求模

bcscale 配置默认小数点位数,相当于Linux bc中的”scale=”

bcsqrt 求高精度数字平方根

bcsub 将两个高精度数字相减

例子:

<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($c-$b)==$a);     // false
var_dump(bcsub($c, $b, 1)==$a); // true
?>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# php  # 浮点数比较  # 浮点数  # php判断两个浮点数是否相等的方法  # 简单谈谈php浮点数精确运算  # PHP中两个float(浮点数)比较实例分析  # PHP中浮点数计算比较及取整不准确的解决方法  # PHP浮点数精度问题汇总  # PHP数据类型之整数类型、浮点数的介绍  # PHP浮点数的一个常见问题  # php的sprintf函数的用法 控制浮点数格式  # php如何比较两个浮点数是否相等详解  # 是因为  # 不需要  # 这个问题  # 不需  # 要再  # 出现错误  # 方法如下  # 舍去  # 相减  # printf  # color  # ff  # lt  # pre  # strong  # brush  # class  # false 


相关文章: 如何在Golang中引入测试模块_Golang测试包导入与使用实践  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何快速使用云服务器搭建个人网站?  如何在服务器上配置二级域名建站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  C++用Dijkstra(迪杰斯特拉)算法求最短路径  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何在新浪SAE免费搭建个人博客?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  如何在局域网内绑定自建网站域名?  如何做静态网页,sublimetext3.0制作静态网页?  微课制作网站有哪些,微课网怎么进?  如何制作一个表白网站视频,关于勇敢表白的小标题?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  建站之星导航如何优化提升用户体验?  如何选择最佳自助建站系统?快速指南解析优劣  北京网站制作网页,网站升级改版需要多久?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何通过万网虚拟主机快速搭建网站?  建站之星代理费用多少?最新价格详情介绍  微信小程序制作网站有哪些,微信小程序需要做网站吗?  济南专业网站制作公司,济南信息工程学校怎么样?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  制作网站外包平台,自动化接单网站有哪些?  如何获取上海专业网站定制建站电话?  建站之星云端配置指南:模板选择与SEO优化一键生成  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  建站之星代理如何优化在线客服效率?  建站之星安装步骤有哪些常见问题?  音响网站制作视频教程,隆霸音响官方网站?  建站之星安装后如何配置SEO及设计样式?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  网页设计与网站制作内容,怎样注册网站?  潮流网站制作头像软件下载,适合母子的网名有哪些?  建站主机服务器选型指南与性能优化方案解析  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  建站10G流量真的够用吗?如何应对访问高峰?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  如何快速搭建支持数据库操作的智能建站平台?  如何续费美橙建站之星域名及服务?  三星网站视频制作教程下载,三星w23网页如何全屏?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  建站之星如何优化SEO以实现高效排名?  css网站制作参考文献有哪些,易聊怎么注册?  如何零基础在云服务器搭建WordPress站点? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。