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


关于PHP的浮点数, 我之前写过一篇文章: 关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP)

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

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

为啥输出是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位)是: 001000111101011100001010001111010111000010100011110

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

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

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

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

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

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

http://bbs.55bbs.com/thread-9954608-1-1.html http://bbs.55bbs.com/thread-9954607-1-1.html http://www.xici.net/d229677444.htm http://www.xici.net/d229677616.htm http://www.xici.net/d229677676.htm http://www.xici.net/d229677752.htm http://www.xici.net/d229677802.htm http://www.xici.net/d229677860.htm

时间: 2024-08-04 14:47:35

PHP浮点数的一个常见问题的解答的相关文章

(转)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浮点数的一个常见问题的解答 (转载 http://www.laruence.com/2013/03/26/2884.html)

不过, 我当时遗漏了一点, 也就是对于如下的这个常见问题的回答: <?php $f = 0.58; var_dump(intval($f * 100)); //为啥输出57 ?> 为啥输出是57啊? PHP的bug么? 我相信有很多的同学有过这样的疑问, 因为光问我类似问题的人就很多, 更不用说bugs.php.net上经常有人问… 要搞明白这个原因, 首先我们要知道浮点数的表示(IEEE 754): 浮点数, 以64位的长度(双精度)为例, 会采用1位符号位(E), 11指数位(Q), 52

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申请后需要

asp编程实例:ASP设计常见问题及解答精要

作为微软推出的网页与数据库解决方案,ASP由于有微软得天独厚的操作系统等技术后盾支持,因此得到了迅速的发展,并且正受到越来越多的欢迎,在目前在电子商务网站的建设中有很多都使用ASP来编写程序. 近来有很多的读者向我们咨询学习ASP的方法和在学习中遇到的一些问题,其中有一些是初学者经常遇到和面临的问题.为了让读者在学习ASP的过程中加深对ASP的了解,并能够有效地解决遇到的问题,我们特别收集了比较有代表性的一些问题,在此列举出来并一一给予解答,希望能在这有限的篇幅里为你学习ASP助一臂之力. 1.

OpenShare常见问题及解答

OpenShare常见问题及回答: Q:OpenShare可以整合SAP么? A:当然可以,OpenShare是真正完全开放的产品,但要进行二次开发,事实上我们帮我们大部分的客户都整合了SAP,包括数据层面的整合,应用层面的整合以及界面的整合 Q:你们OpenShare的免费版是不是功能上有缩减啊? A:我们免费的是完整版,无任何限制,我们是彻底,完全,永久的免费,而且免费的许可是无限的,免费的许可包括: OpenShare 基础Server的无限使用 无限公司级门户的使用许可 无限部门级门户的

memcache常见问题及解答

memcached的cache机制是怎样的? Memcached主要的cache机制是LRU(最近最少用)算法+超时失效.当您存数据到memcached中,可以指定该数据在缓存中可以呆多久Which is forever, or some time in the future.如果memcached的内存不够用了,过期的slabs会优先被替换,接着就轮到最老的未被使用的slabs. memcached如何实现冗余机制? 不实现!我们对这个问题感到很惊讶.Memcached应该是应用的缓存层.它的

OC中一些常见问题及解答

1.     Object-C有多继承吗?没有的话用什么代替? cocoa 中所有的类都是NSObject 的子类 多继承在这里是用protocol 委托代理 来实现的 你不用去考虑繁琐的多继承 ,虚基类的概念. ood的多态特性 在 obj-c 中通过委托来实现. 2.     Object-C有私有方法吗?私有变量呢? objective-c – 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话,