php 浮点数比较方法详解

发布时间 - 2026-01-11 00:59:18    点击率:

浮点数运算精度问题

首先看一个例子:

<?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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Firefox Developer Edition开发者版本入口  晋江文学城电脑版官网 晋江文学城网页版直接进入  中国移动官方网站首页入口 中国移动官网网页登录  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何基于PHP生成高效IDC网络公司建站源码?  个人摄影网站制作流程,摄影爱好者都去什么网站?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  QQ浏览器网页版登录入口 个人中心在线进入  java中使用zxing批量生成二维码立牌  图册素材网站设计制作软件,图册的导出方式有几种?  浅谈redis在项目中的应用  如何用已有域名快速搭建网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  Android使用GridView实现日历的简单功能  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  *服务器网站为何频现安全漏洞?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  微信小程序制作网站有哪些,微信小程序需要做网站吗?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  JS中对数组元素进行增删改移的方法总结  怎么用AI帮你设计一套个性化的手机App图标?  微信小程序 配置文件详细介绍  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  制作企业网站建设方案,怎样建设一个公司网站?  中山网站制作网页,中山新生登记系统登记流程?  EditPlus中的正则表达式实战(6)  javascript日期怎么处理_如何格式化输出  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何在企业微信快速生成手机电脑官网?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  香港网站服务器数量如何影响SEO优化效果?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何用好域名打造高点击率的自主建站?  青岛网站建设如何选择本地服务器?  如何快速生成可下载的建站源码工具?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  JS弹性运动实现方法分析  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  在线制作视频网站免费,都有哪些好的动漫网站?  Laravel API资源类怎么用_Laravel API Resource数据转换