PHP高精度数学运算函数

摘要:
php浮点数计算比较及取整不准确。举例:$a=0.2+0.7;$b=0.9;var_dump;//输出的结果为boolPHP官方手册说明:显然简单的十进制分数如0.2不能在不丢失一点点精度的情况下转换为内部二进制的格式。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。需要说明的是,这不是PHP的问题,而是计算机内部处理浮点数的问题!

php 浮点数计算比较及取整不准确。举例:
$a = 0.2+0.7;
$b = 0.9;
var_dump($a == $b); //输出的结果为bool(false)
PHP 官方手册说明:显然简单的十进制分数如 0.2 不能在不丢失一点点精度的情况下转换为内部二 进制的格式。
printf("%0.20f", $a); //输出的结果为0.89999999999999991118
printf("%0.20f", $b); //输出的结果为0.90000000000000002220
根据结果说明,作为浮点型数据,其精度已经损失了一部分,达不到完全精确。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。
需要说明的是,这不是 PHP 的 问题,而是计算机内部处理浮点数的问题!在 C、JAVA 等语言中也会遇到同样的问题。

解决方法:

1)需要将其控制在我们需要的精度范围内再行比较。
因此使用 bcadd() 函数 来对浮点数想加并进行精度转换(为字符串):
var_dump(bcadd(0.2,0.7,1) == 0.9); // 输出的结果为bool(true)

也可以使用round() 函数是按照指定的精度进行四舍五入:
var_dump(round(0.2+0.7,2) == 0.9);// 输出的结果为bool(true)

2)BCMath扩展
bcadd: 将二个高精确度数字相加。
bccomp: 比较二个高精确度数字。
bcdiv: 将二个高精确度数字相除。
bcmod: 取得高精确度数字的余数。
bcmul: 将二个高精确度数字相乘。
bcpow: 求一高精确度数字次方值。
bcscale: 配置程序中所有BC函数库的默认小数点位数。
bcsqrt: 求一高精确度数字的平方根。
bcsub: 将二个高精确度数字相减。

免责声明:文章转载自《PHP高精度数学运算函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇spring-data-jpa查询报错-No property ... found for ... Did you meanEcharts(曲线图)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

php的下载与安装

一,进入到php的官方网站   https://www.php.net/   ,进入到下载页面: 选择 PHP 7.2.30 的Windows版本  具体的下载页面版本区分: 下载后,得到如下压缩包到如下目录   进入到php目录  D:wampphp7230 把文件  php.ini-development  复制一份,改名为  php.ini...

apache中配置php支持模块模式、cgi模式和fastcgi模式

首先安装apache、mysql和php,依次顺序安装。 1.apache、mysql的安装比较简单,略过 2. php的安装,我安装的是php5.3.6内置了php-fpm,所以不需要再单独下补丁了。 ./configure –prefix=/usr/local/php5 /--with-mysql=/usr/local/mysql /--enable-...

PHP安全

php如何做到安全 14 November 2013 0 一、概念和原则 所有的输入数据都是不安全的 我们不能信任任何外来的数据,例如用户的表单提交数据、请求字符串、甚至是RSS种子,都不能信任。这些数据都可以被伪造。 这些数据中可能故意包含某些字符,破坏程序的运行环境,例如可能包含有害的javascript代码。 因此,PHP预定义全局数组中的...

CmsTop 大众版运行环境搭建 (CentOS+Nginx+PHP FastCGI)

一、CentOS 5.5 操作系统的安装 操作系统这里我们仍采用 CentOS 5.5 来说明 Linux 下的 Nginx 安装与配置。关于CentOS的安装与注意事项请大家点击这里:(其中包含配置yum的步骤,因为我们接下来会使用到yum)。 二、准备工作 和Apache的配置相同,我们就来进行一些准备工作,譬如创建网站目录,日志目录等。然后安装服务器...

如何让您的php也支持pthreads多线程

  我们常常会碰到这样一种情况,开发环境在windows下开发,而生产环境确是linux。windows下能正常运行,上传到linux后却无法好好地玩耍了。然后开始了一轮尼玛式的疯狂的查找原因,最后发现是服务器环境问题。这时只能默默地爆一句shit。最近在用php多线程开发一个小功能也碰到类似的问题,在此记录一下。   1、查找资料发现php5.3或以上,...

php 报错等级

定义和用法:error_reporting() 设置 PHP 的报错级别并返回当前级别。 函数语法:error_reporting(report_level) 如果参数 level 未指定,当前报错级别将被返回。下面几项是 level 可能的值:值 常量 描述1 E_ERROR 致命的运行错误。错误无法恢复,暂停执行脚本。2 E_WARNING 运行时警告...