返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php 无法计算浮点数怎么办
  • 264
分享到

php 无法计算浮点数怎么办

php浮点数 2022-03-22 08:03:18 264人浏览 无得
摘要

本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php 无法计算浮点数怎么办?php中浮点数计算问题 如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*1

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

php 无法计算浮点数怎么办?

php中浮点数计算问题

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

  例子

<?php    
$f = 0.58;    
var_dump(intval($f * 100)); 
//为啥输出57
?>

  为啥输出是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 函数

代码如下:

<?php
$a = 0.1;
$b = 0.7;
var_dump(bcadd($a,$b,2) == 0.8);
  bcadd — 将两个高精度数字相加
  bccomp — 比较两个高精度数字,返回-1, 0, 1
  bcp — 将两个高精度数字相除
  bcmod — 求高精度数字余数
  bcmul — 将两个高精度数字相乘
  bcpow — 求高精度数字乘方
  bcpowmod — 求高精度数字乘方求模,数论里非常常用
  bcscale — 配置默认小数点位数,相当于就是linux bc中的”scale=”
  bcsqrt — 求高精度数字平方根
  bcsub — 将两个高精度数字相减

  整理了一些实例

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

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

推荐学习:《PHP视频教程

以上就是php 无法计算浮点数怎么办的详细内容,更多请关注编程界其它相关文章!

--结束END--

本文标题: php 无法计算浮点数怎么办

本文链接: https://lsjlt.com/news/643.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php 无法计算浮点数怎么办
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php 无法计算浮点数怎么办?php中浮点数计算问题 如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*1...
    99+
    2022-03-22
    php 浮点数
  • 如何解决php无法计算浮点数问题
    这篇文章主要介绍如何解决php无法计算浮点数问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php无法计算浮点数是因为计算机底层二进制无法精确表示浮点数,其解决办法就是使用精准计算的类库或函数库,如使用php中的B...
    99+
    2023-06-25
  • Java中怎么精确计算浮点数
    今天就跟大家聊聊有关Java中怎么精确计算浮点数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。问题的提出:XML:namespace prefix = o ns = "ur...
    99+
    2023-06-03
  • 解决PHP浮点数计算精度丢失的方法
    解决PHP浮点数计算精度丢失的方法 在PHP中,由于浮点数的本质是二进制表示,会导致在进行计算时出现精度丢失的问题。这种问题在一些对精度要求较高的场景下就显得尤为重要。为了避免由于浮点...
    99+
    2024-02-27
    解决方法 php浮点数 计算精度
  • Python tensorflow与pytorch的浮点运算数怎么计算
    这篇文章主要讲解了“Python tensorflow与pytorch的浮点运算数怎么计算”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python tensorflow...
    99+
    2023-07-04
  • php浮点数怎么用
    这篇文章主要介绍了php浮点数怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php浮点数指的是Float浮点型,可以通过“$a = 1.234;$b = 1.2e3;$...
    99+
    2023-06-21
  • PHP浮点数计算误差原因及避免策略
    PHP作为一种流行的服务器端脚本语言,在进行浮点数计算时常常会遇到精度丢失或计算误差的问题,这些问题可能会对程序的准确性和稳定性造成影响。本文将探讨PHP浮点数计算误差的原因,并提出一...
    99+
    2024-02-27
    php 浮点数 精度
  • php浮点数用法是什么
    本文操作环境:windows7系统、PHP7.4版、DELL G3电脑php浮点数用法是什么php Float 浮点型 浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:<php $a ...
    99+
    2017-12-26
    php 浮点数
  • win8计算机管理无法打开怎么办
    这篇文章给大家分享的是有关win8计算机管理无法打开怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在win8系统桌面上新建一个“文本文档”。打开文档,将代码复制进去:Windows registry edi...
    99+
    2023-06-28
  • [Python3]计算高精确度的浮点数方
    计算高精确度的浮点数方法借助decimal模块的”getcontext”和”Decimal”方法from decimal import *getcontext().prec = 50 #50精度a = Decimal(1) / Decim...
    99+
    2023-01-31
    精确度 浮点数
  • PHP浮点数四舍五入法
    这篇文章将为大家详细讲解有关PHP浮点数四舍五入法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 浮点数四舍五入法 概述 浮点数在计算机中表示为小数点后跟指数,然而,它们通常以有限位数的近似值存储。...
    99+
    2024-04-02
  • php无法添加数据怎么办
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php无法添加数据怎么办?问题描述:数据库可以连接成功,但是php就是无法插入数据,哪位大神看看是不是代码出了问题<php if( @ $_POST[&quo...
    99+
    2024-04-02
  • PHP怎么计算整数除法的
    小编给大家分享一下PHP怎么计算整数除法的,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.语法    intdiv(divident, divisor);2.示例<...
    99+
    2023-06-14
  • php怎么把整数设置为浮点数
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php怎么把整数设置为浮点数?php将整型转换为浮点型新建一个php文件,命名为test.php,用于讲解php如何将整型转换为浮点型。在test.php文件中,使用he...
    99+
    2019-04-08
    php 整数 浮点数
  • PHP返回除法的浮点数余数
    这篇文章将为大家详细讲解有关PHP返回除法的浮点数余数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 中返回除法的浮点数余数 在 PHP 中,浮点数除法(/ 操作符)的结果是一个浮点数,通常包含小数...
    99+
    2024-04-02
  • C语言中怎么用浮点数计算三维空间的几何
    在C语言中,可以使用浮点数来表示三维空间中的点、向量、线段等对象,并进行相关的几何运算,如计算两点之间的距离、向量的长度、点与线段的...
    99+
    2024-04-28
    C语言
  • php 无法导入数据库怎么办
    本文操作环境:windows7系统、PHP7.4版、DELL G3电脑php 无法导入数据库怎么办php中编辑器的内容插入不进数据库怎么办使用php,编辑器中的内容不能插入数据库,主要在于以下两个方面:一、数据库设计不合理,比如使用Mysq...
    99+
    2019-08-06
    php 数据库
  • vue无法打断点怎么办
    本教程操作环境:Windows10系统、Vue 3版、Dell G3电脑。vue无法打断点怎么办?谷歌浏览器 VUE 不能 加断点调试 解决方法谷歌浏览器可以断点调试JS函数方法如下:F12,进入浏览器调试页面点击sources找到要调试的...
    99+
    2023-05-14
    Vue
  • 怎么使用PHP浮点型
    这篇文章将为大家详细讲解有关怎么使用PHP浮点型,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。声明方式主要有两种:1:科学声明2:普通声明对于普通声明来说,代码如下:<php//声明浮点型变量$fl...
    99+
    2023-06-15
  • windows无法启动此程序计算机丢失oci.dll怎么办
        1思路是从网上找到   2下载好dll文件之后,将dll文件复制到c:\\Windows\\system32\目录下即可。   3在此 ...
    99+
    2023-06-04
    windows 丢失oci.dll 计算机 程序
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作