PHP IEEE 754 精度错误

原创 2016年05月13日 17:56:01

运行如下代码

$t = 39.800 * 100;
echo $t.'<br>';
echo intval($t);

结果:

3980
3979


文档解释

http://php.net/manual/zh/language.types.float.php

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。

此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等


这里使用是学函数来解决

$t = bcmul(39.800 , 100);
echo $t.'<br>';
echo intval($t);

结果

3980
3980

版权声明:本文为博主原创文章,未经博主允许不得转载。

IEEE 754 浮点数的表示精度探讨

IEEE 754 浮点数的表示精度探讨 前言 从网上看到不少程序员对浮点数精度问题有很多疑问,在论坛上发贴询问,很多热心人给予了解答,但我发现一些解答中有些许小的错误和认识不当之处。我曾经...

IEEE 754 浮点数的表示精度探讨

转载自bossin的博客 原文地址:http://www.cnblogs.com/bossin/archive/2007/04/08/704567.html 前言 从网上看到不少程...

IEEE754,浮点数的精度

http://zh.wikipedia.org/wiki/IEEE_754 IEEE二进制浮点数算术标准(IEEE 754)是1980年代以来最广泛使用的浮点数运算标准,为许多CPU与浮...

IEEE 754 浮点数的表示精度探讨

前言 从网上看到不少程序员对浮点数精度问题有很多疑问,在论坛上发贴询问,很多热心人给予了解答,但我发现一些解答中有些许小的错误和认识不当之处。我曾经做过数值算法程序,虽然基本可用,但是被浮点数精...
  • fym0121
  • fym0121
  • 2013年06月19日 20:57
  • 2672

IEEE 754 浮点数的表示精度探讨

前言 从网上看到不少程序员对浮点数精度问题有很多疑问,在论坛上发贴询问,很多热心人给予了解答,但我发现一些解答中有些许小的错误和认识不当之处。我曾经做过数值算法程序,虽然基本可用,但是被浮点数精...

网上找的浮点数表示为二进制的方法,IEEE754规则

https://zhidao.baidu.com/question/487356275489103692.html http://blog.csdn.net/richerg85/article/det...

浮点数的表示及范围 IEEE754

浮点数与IEEE754 浮点数 1.   什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达...

IEEE754关于double格式定义的认识

利用计算机对有理数集合进行存储,想完全表示出来肯定是不行的,有理数集是无限集,而计算机的存储空间是有限的,因此在设计数据类型时就应当考虑到这些因素。 而在考虑的所有的因素中,要求同样的存储空间尽可能...

IEEE 754 double 编码为二进制

此文版权属于作者所有,任何人、媒体或者网站转载、借用都必须征得作者本人同意!    有些系统的 double 的 sizeof 不为 8,或者 double 在内存里的表示不是 IEEE 754 ...
  • lzy0168
  • lzy0168
  • 2011年10月19日 10:59
  • 1593
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP IEEE 754 精度错误
举报原因:
原因补充:

(最多只允许输入30个字)