PHP浮点数的一个常见问题的解答 (转载 http://www.laruence.com/2013/03/26/2884.html)

不过, 我当时遗漏了一点, 也就是对于如下的这个常见问题的回答:

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

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

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

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

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

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

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

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

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

  1. 0.58的二进制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111
  2. 0.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101

而两者的二进制, 如果只是通过这52位计算的话,分别是:

  1. 0.58 -> 0.57999999999999996
  2. 0.57 -> 0.56999999999999995

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

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

<?php

echo bccomp(‘1‘, ‘2‘) . "\n";   // -1
echo bccomp(‘1.00001‘, ‘1‘, 3); // 0
echo bccomp(‘1.00001‘, ‘1‘, 5); // 1

?>

eturns 0 if the two operands are equal, 1 if the left_operand is larger than the right_operand, -1 otherwise.
var_dump(bcadd(0.2,0.7,1) == 0.9); // 输出:bool(true)

http://php.net/manual/en/function.bcmul.php

时间: 2024-10-29 00:34:45

PHP浮点数的一个常见问题的解答 (转载 http://www.laruence.com/2013/03/26/2884.html)的相关文章

(转)PHP浮点数的一个常见问题的解答

作者: Laruence 原文地址: http://www.laruence.com/2013/03/26/2884.html 关于PHP的浮点数, 我之前写过一篇文章: 关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP) 不过, 我当时遗漏了一点, 也就是对于如下的这个常见问题的回答: <?php $f = 0.58; var_dump(intval($f * 100)); //为啥输出57 ?> 为啥输出是57啊? PHP的bug么? 我相

PHP浮点数的一个常见问题的解答

关于PHP的浮点数, 我之前写过一篇文章: 关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP) 不过, 我当时遗漏了一点, 也就是对于如下的这个常见问题的回答: $f = 0.58; var_dump(intval($f * 100)); //为啥输出57 ?> 为啥输出是57啊? PHP的bug么? 我相信有很多的同学有过这样的疑问, 因为光问我类似问题的人就很多, 更不用说bugs.php.net上经常有人问… 要搞明白这个原因, 首先我们要

PHP常见问题及解答

当作PHP学习时,总是会在baidu上查很多的例如开发环境的选择呀,PHP好不好呀!或者是不是转学JAVA,或是.NET等: 首先本人是从2010年下半年开始报名学的PHP(IN Guangzhou),每周一天学了近6个月左右,从最基础的HTML,CSS,DIV,JAVASCRIPT,AJAX,PHP,然后学二次开发:闲暇之余还开通了一个个人blog( PHP wordpress); 由于个人工作原因,这几年放了一段时间未动PHP了,今年开始又自学了.NET; ---目的就想业余做一份兼职,锻炼

跟王老师学MySQL:MySQL数据类型常见问题及解答

跟王老师学MySQL:MySQL数据类型常见问题及解答 主讲教师:王少华   QQ群号:483773664 学习内容 整数类型和浮点类型的异同 浮点数类型和定点数类型的异同 char和varchar类型的异同 时间和日期类型的异同 text和blob的异同 存储路径字符串的注意事项 mysql如何存储boolean类型 null的处理 在MySQL中创建表时,需要考虑为字段选择哪种数据类型是最合适的.选择了合适的数据类型,会提高数据库的效率. 一.整数类型和浮点类型 整数类型和浮点类型最大区别是

美国EB-5投资移民项目常见问题的解答

(来源:北京兆龙移民公司www.zhaolong.net 转载请注明出处) 随着现在移民现象的普遍,越来越多的富豪选择进行投资移民到国外,尤其是美国,那么对于美国投资移民有很多的人又会遇到很多不同的问题,那么下面兆龙移民来给大家介绍一下EB-5投资移民项目常见问题的解答吧! 问:谁应该申请办理 EB-5 投资? 答:美国EB-5移民项目的投资者包括来自社会各个阶层.专业人士,商业人士,想要帮助孩子得到良好教育的家长,外国学生和退休人员等,都可以申请美国EB-5移民的项目. 问:EB-5申请后需要

Servlet入门总结及第一个Servlet程序 (转载)

转载请注明出处http://blog.csdn.net/evankaka 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 Servlet生命周期 五servlet工作过程 六 Servlet与JSP区别 七Servlet代码结构 八 Servlet第一个程序 一.了解servlet 概念 Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容.Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能.Serv

230行实现一个简单的MVVM(转载)

https://zhuanlan.zhihu.com/p/24475845 作者:mirone链接:https://zhuanlan.zhihu.com/p/24475845来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 题图的PixivID为:pixiv-ID: 14402942,画师为RAHWIA 本文始发于我的博客,转载请注明作者. MVVM这两年在前端届掀起了一股热潮,火热的Vue和Angular带给了开发者无数的便利,本文将实现一个简单的MVVM,用20

Hibernate+Spring+Struts2整合开发中的一个分页显示方案(转载)

分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流. 1.DAO层接口的设计,在MemberDao接口中定义了如下两个方法: public interface MemberDao{        //省略了其他的代码        /**     * 分页查询     * @

A+B Problem 详细解答 (转载)

此为详细装13版 转载自:https://vijos.org/discuss/56ff2e7617f3ca063af6a0a3 全文如下,未作修改,仅供围观,不代表个人观点: 你们怎么都在做网络流,不就是一道简单的递推吗   发表于2016-04-02 10:29 而且你们假惺惺的用网络流,过程中还是要用加法,我一个加法都没用. #include <cstdio> int m, n, a[32768][32768]; int main() { scanf("%d%d", &