千家信息网

如何解决php无法计算浮点数问题

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍如何解决php无法计算浮点数问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php无法计算浮点数是因为计算机底层二进制无法精确表示浮点数,其解决办法就是使用精
千家信息网最后更新 2026年11月04日如何解决php无法计算浮点数问题

这篇文章主要介绍如何解决php无法计算浮点数问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

php无法计算浮点数是因为计算机底层二进制无法精确表示浮点数,其解决办法就是使用精准计算的类库或函数库,如使用php中的BC高精确度函数库即可。

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑

php中浮点数计算问题

 如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的,我用python也遇到这个问题。所以基本上大部分语言都提供了精准计算的类库或函数库,比如php有BC高精确度函数库,下面介绍一下一些常用的BC高精确度函数使用。

  例子

  为啥输出是57啊? PHP的bug么?

  我相信有很多的同学有过这样的疑问, 因为光问我类似问题的人就很多, 更不用说bugs.php.net上经常有人问…

  要搞明白这个原因, 首先我们要知道浮点数的表示(IEEE 754):

  浮点数, 以64位的长度(双精度)为例, 会采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位).

  符号位:最高位表示数据的正负,0表示正数,1表示负数。

  指数位:表示数据以2为底的幂,指数采用偏移码表示

  尾数:表示数据小数点后的有效数字.

  这里的关键点就在于, 小数在二进制的表示, 关于小数如何用二进制表示, 大家可以百度一下, 我这里就不再赘述, 我们关键的要了解, 0.58 对于二进制表示来说, 是无限长的值(下面的数字省掉了隐含的1)..

  0.58的二进制表示基本上(52位)是: 00101000111101011100001010001111010111000010100011110.57的二进制表示基本上(52位)是: 001000111101011100001010001111010111000010100011110而两者的二进制, 如果只是通过这52位计算的话,分别是:www.111cn.net

  0.58 -> 0.579999999999999960.57 -> 0.5699999999999999至于0.58 * 100的具体浮点数乘法, 我们不考虑那么细, 有兴趣的可以看(Floating point), 我们就模糊的以心算来看… 0.58 * 100 = 57.999999999

  那你intval一下, 自然就是57了….

  可见, 这个问题的关键点就是: "你看似有穷的小数, 在计算机的二进制表示里却是无穷的"

  so, 不要再以为这是PHP的bug了, 这就是这样的…..

  PHP浮点型在进行+-*%/存在不准确的问题

  例如:

  $a = 0.1;  $b = 0.7;  var_dump(($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 函数

代码如下:

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

  整理了一些实例

  php BC高精确度函数库包含了:相加,比较,相除,相减,求余,相乘,n次方,配置默认小数点数目,求平方。这些函数在涉及到有关金钱计算时比较有用,比如电商的价格计算。

  注意点:关于设置的位数,超出部分是丢弃掉,而不是四舍五入。

以上是"如何解决php无法计算浮点数问题"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

点数 数字 二进制 函数 高精 高精度 问题 精确 两个 小数 就是 精度 精确度 结果 位数 关键 十进制 小数点 数据 计算机 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州淘业互联网络科技 互联网科技公司华为 深圳恒合互联网络科技有限公司 网络科技有限互联网 中国 科技 互联网 云电互联网科技 赫美联合互联网科技 互联网科技博客 新华互联网科技校企合作 太原新华互联网科技学校怎么样 昭通云南众福互联网科技有限公司 互联网和黑科技的看法 互联网科技商业 速维有品互联网信息科技(苏州)有限公司 佛山市拉法互联网科技有限公司 互联网金融科技名词解释 众安科技工业互联网合作 互联网对科技影响 保山浩联互联网科技有限公司 如何强化互联网金融科技 南京欣网互联网络科技 狮子座互联网科技培训 金融科技和互联网金融 深圳国际航运科技和互联网 常德市电业局互联网科技部 科技与互联网哪个更好 昊天互联网科技有限公司 亳州好赞互联网科技有限公司 工业互联网展湾科技股份有限公司 上海互联网科技园景观
0