开发者社区> 桃子红了呐> 正文

PHP浮点数的精确计算BCMath

简介:
+关注继续查看

Php: BCMath
bc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string leftoperand,stringleftoperand,stringright_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值。这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string。

bcadd — 将两个高精度数字相加
bccomp — 比较两个高精度数字,返回-1, 0, 1
bcdiv — 将两个高精度数字相除
bcmod — 求高精度数字余数
bcmul — 将两个高精度数字相乘
bcpow — 求高精度数字乘方
bcpowmod — 求高精度数字乘方求模,数论里非常常用
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt — 求高精度数字平方根
bcsub — 将两个高精度数字相减

首先看一段代码:

<?php
$a = 0.1;
b=0.7;vardump((b=0.7;vardump((a + $b) == 0.8);

打印出来的值居然为 boolean false

这是为啥?PHP手册对于浮点数有以下警告信息:

Warning
浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

那么上面的算式我们应该改写为

<?php
$a = 0.1;
b=0.7;vardump(bcadd(b=0.7;vardump(bcadd(a,$b,2) == 0.8);

这样就能解决浮点数的计算问题了



本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/5531687.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PHP浮点数转int精度丢失?
PHP浮点数转int精度丢失?
174 0
PHP为什么可以连接MySQL?底层原理是什么?
PHP为什么可以连接MySQL?底层原理是什么?
84 0
php为什么选mysql作为数据库?
php为什么选mysql作为数据库?
31 0
PHP操作MySQL实现增删改查的底层原理是什么?
PHP操作MySQL实现增删改查的底层原理是什么?
58 0
Docker 可以通过创建多个容器,分别部署 Linux、Nginx、MySQL 和 PHP 等组件,为什么不可以一个容器包含所有呢?底层原理是什么?
Docker 可以通过创建多个容器,分别部署 Linux、Nginx、MySQL 和 PHP 等组件,为什么不可以一个容器包含所有呢?底层原理是什么?
121 0
基于PHP和MySQL的新闻发布系统——【功能优化】
基于PHP和MySQL的新闻发布系统——【功能优化】
33703 0
基于PHP和MySQL的新闻发布系统
基于PHP和MySQL的新闻发布系统
63 0
开心档-软件开发入门之PHP - AJAX 与 MySQL
本文主要讲解AJAX 可用来与数据库进行交互式通信。
52 0
如何修复“PHP 安装缺少 WordPress 所需的 MySQL 扩展”的错误?
在WordPress建站,WordPress定制开发过程中,开发者容易遇见“您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展”的错误提示,如果出现这样的情况,应该怎么办?北京六翼信息有限公司的开发工程师指出,要修复错误“您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展”,您需要确保您的 PHP 安装已正确安装和配置 MySQL 数据库驱动程序 (mysqlnd) 和 mysqli 扩展。只有这样,您才能恢复 WordPress 和 WordPress 数据库之间的正常连接,并让您的网站重新运行。
94 0
ECS配置mySQL\MariaDB和PHP环境
ECS配置mySQL\MariaDB和PHP环境
54 0
+关注
桃子红了呐
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
PHP运行机制初探
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多