`

PHP浮点数精度损失问题

    博客分类:
  • PHP
阅读更多

 

    首先抛出一个问题,如下类似:

<?php
$a = 0.57;
echo intval(floatval($a) * 100); //56

    结果可能有点出乎你的意外,PHP遵循IEEE 754双精度:

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

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

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

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

 

    再来看看小数用二进制怎么表示:

    乘2取整,顺序排列,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分,但是像0.57这样的小数像这样一直乘下去,小数部分不可能为0.有效位的小数用二进制表示却是无穷的。

 

    0.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101

    如果只有52位的话,0.57 =》 0.56999999999999995

 

    对于高精度数据操作,建议使用以下函数:

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

相关推荐

    PHP浮点数精度问题汇总

    在了解了PHP浮点数精度问题和处理方法之后,值得注意的是,大多数情况下精度损失并不会对结果产生太大影响,尤其是在非金融计算中。但对于需要精确计算的应用,比如科学计算和金融计算,就需要格外注意并使用更精确...

    简单谈谈php浮点数精确运算

    比如在初始的例子中,`bcadd($a, $b, 2)` 可以确保结果精确到小数点后两位,从而避免了浮点数精度问题导致的错误。 为了保证浮点数计算的精确性,开发人员应尽量避免依赖浮点数的直接比较,而是使用 BCMath 或 GMP...

    php 浮点数比较方法详解

    在PHP编程中,浮点数的比较是一项基本而重要的操作。由于计算机内部使用二进制来表示和存储浮点数,而某些十进制浮点数在转换为二进制时无法...通过上述方法,可以在很大程度上避免由于浮点数精度问题导致的错误判断。

    你应该知道PHP浮点数知识

    在PHP编程中,浮点数(浮点数)是一个重要的数据类型,特别是在处理不精确...由于双精度浮点数能精确表示的整数范围是`-2^53 + 1`到`2^53 - 1`,所以一个`long`整数只要不超过`2^53 - 1`,转换过程就不会导致精度损失。

    浮点数近似值和使用错误

    Python的浮点数处理也遵循同样的二进制浮点数规则,可能导致精度损失。 VBA(Visual Basic for Applications)在Excel和其他Microsoft Office应用程序中使用,同样支持`Single`和`Double`浮点数。在进行财务计算或...

    第3章PHP中的常量与变量

    3. 浮点型(float):也称为双精度型,用于存储小数,精度可能因平台而异,且浮点数运算可能会导致精度损失。 4. 字符串(string):由一串字符组成,可以使用单引号、双引号或定界符定义。 除了这些标量类型,PHP...

    PHP中有关长整数的一些操作教程

    由于这样的限制,在处理大数值时,开发者常常使用字符串来表示这些大数,以避免精度损失。当必须进行数学计算,比如加、减、乘、除和进制转换时,PHP内置的数学函数就显得力不从心。这时,可以借助PHP扩展库BCMath,...

    php-7.2.18.tar.gz

    4. **改进的浮点数精度**:PHP 7.2.18对浮点数的表示和计算进行了优化,减少了浮点数运算中的不精确性。 综上所述,PHP 7.2.18是PHP发展历程中的一个重要里程碑,它的高性能和创新特性使其成为开发者的首选。无论是...

    Money一个Fowler货币模式的PHP实现

    1. **货币类(Money)**:这个类会封装一个货币的数值,通常使用整数表示,以避免浮点数精度问题。它可能包含构造函数,接收货币的值和货币类型(如USD、EUR等)。 2. **货币工厂(MoneyFactory)**:用于创建Money...

    mysql执行时间为负数的原因分析

    总结来说,MySQL执行时间出现负数是由于PHP浮点数的精度问题,理解这一原理有助于我们在编写涉及浮点数运算的代码时,采取适当的策略来避免或减少精度误差的影响。在处理时间差计算时,选择合适的数据类型和方法是至...

    php-bcmath-5.3.3-3.el6.x86_64

    这对于金融计算、科学计算或其他需要精确计算的场景尤其重要,因为常规的浮点数运算可能会导致精度损失。 总之,PHP BCMath扩展是一个强大的工具,提供了在PHP中进行任意精度数学运算的能力,而...

    PHP2019最新面试题.docx

    4. **浮点数精度问题**: 浮点数在PHP中不适用于精确计算,因为它们在内部以二进制表示,可能导致微小的精度损失。在例子中,`$a = 0.1; $b = 0.7;`虽然`$a + $b`看起来应该等于0.8,但实际计算结果可能是0.7999999...

    Numphp一个操作数字的PHP库

    例如,它可能包含了一个类或接口,用于表示任意精度的数字,避免了PHP内置数据类型(如float)在计算过程中可能出现的精度损失。 此外,Numphp可能包含了各种数学函数,比如平方根、立方根、指数、对数、三角函数等...

    php.ini中文注释版.doc

    `short_open_tag = On`允许使用短标签&lt;?php&gt;,`asp_tags = Off`禁用ASP风格的标签,`precision = 14`定义浮点数的显示精度,`y2k_compliance = Off`关闭Y2K兼容性以避免某些非Y2K兼容浏览器的问题。`output_...

    PHP安装BCMath扩展的方法

    BCMath扩展提供了一套完整的任意精度数学函数库,可以处理非常大的数字,避免了浮点数运算中的精度损失问题。本文将详细介绍如何在PHP环境中安装BCMath扩展。 首先,我们来看一下安装BCMath扩展的基本步骤: 1. **...

    php中json_decode()和json_encode()的使用方法.docx

    同时,`json_encode()`在处理浮点数时可能会有精度损失,因为JSON标准仅支持IEEE 754双精度浮点数。 总结起来,`json_decode()`和`json_encode()`是PHP中处理JSON数据的核心工具。它们在Web开发中扮演着重要角色,...

Global site tag (gtag.js) - Google Analytics