목차
Comments
php教程 php手册 PHP浮点数的一个常见问题的解答

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

Jun 06, 2016 pm 08:08 PM
php 작가 흔한 답변

作者: Laruence( ) 本文地址: http://www.laruence.com/2013/03/26/2884.html 转载请注明出处 关于PHP的浮点数, 我之前写过一篇文章: 关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP) 不过, 我当时遗漏了一点, 也就是对于如下的这个常见问

  • 作者: Laruence(PHP浮点数的一个常见问题的解答 PHP浮点数的一个常见问题的解答 PHP浮点数的一个常见问题的解答 PHP浮点数的一个常见问题的解答)
  • 本文地址: 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么?

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

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

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

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

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

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

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

0.58的二进制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111
0.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101
로그인 후 복사

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

0.58 -> 0.57999999999999996
0.57 -> 0.56999999999999995
로그인 후 복사

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

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

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

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


Comments

  • 2013/03/26, FtMan writes: 受教,回头再详细查查
  • 2013/03/26, 梦康 writes: 汗,原来还得先转成二进制。小数转二进制,真不知道。说实话这个问题我们这种低级打字员用得比较少,但是知道也好。
  • 2013/03/26, xxx writes: 那这种情况如何避免? 浮点和整数之间的计算还是很多的..
  • 2013/03/26, 花生 writes: 好东西,必须弄懂的
  • 2013/03/26, wy writes: 别用intval,用round ...
  • 2013/03/26, kevin writes: function _intval($n){ return floor(floatval($n)); } 这样如何?
  • 2013/03/26, Melo618 writes: 另一个例子:
  • 2013/03/26, Anonymous writes: 另一个例子: $n="19.99"; intval($n * 100); // prints 1998 intval(strval($n * 100)); // prints 1999 printf("%.13f", $n * 100);// prints 1998.9999999999998
  • 2013/03/26, dodgepudding writes: 习惯上都是先round再intval吧
  • 2013/03/26, bright writes: 不仅仅php,java也是这样的~ 面试的人都喜欢这些啊。
  • 2013/03/27, justjavac writes: 以前写的一篇浮点数的文章: 代码之谜(四)- 浮点数(从惊讶到思考) http://justjavac.iteye.com/blog/1725977
  • 2013/03/27, mcfog writes: javascript:alert(parseInt(0.58*100)) JS的结果也是一样的
  • 2013/04/01, wxf writes: echo会自动判断这种情况吗?因为同样intval(.57*100)值是56,但是echo出来是57
  • 2013/04/06, kevin writes: php> = intval(0.58 * 100 ) 57 php> = intval(0.58 * 100 . '' ) 58 转string时发生了什么?btmath是如何解决这个问题的?
  • 2013/04/07, Anonymous writes: 看来还是计算机科班出身的好
  • 2013/04/08, Anonymous writes: $ php -r "var_dump(intval(57.999999999999999));"; int(58) $ php -r "var_dump(intval(57.99999999999999));"; int(57)
  • 2013/04/09, gaodi07 writes: 小数点转二进制。。。不知道咋转,受教了
  • 2013/04/12, pengzhen writes: 那为什么直接echo出来的是正确的了,echo 0.58*100 得出的就是58,为什么不是57.9999999996
  • 2013/04/12, pengzhen writes: 还能再问你个问题吗,你博客里的那些php代码高亮是怎么实现的
  • 2013/04/16, ppoo24 writes: @pengzhen 因为这个例子是$f = 0.58;是有个赋值动作的,也就是0.58会被存储,而存储就将以二进制保存。你如果直接输出0.58 * 100这个操作,是不会有存储这步
  • 2013/04/16, ppoo24 writes: @pengzhen 不好意思,我刚才的推测,应该是错误的
  • 2013/04/17, FtMan writes: 好人 一生平安
  • 2013/04/19, karocxing writes: 话说,echo 出来是正确的几位同学,为什么要echo 0.58 * 100? 而不是 echo intval(0.58 * 100) 呢? 汗一个先。
  • 2013/04/19, karocxing writes: 还有,echo intval(0.57 * 100) 和 var_dump(intval(0.57 * 100))结果都是56。。。 0.58的也都是57。。。
  • 2013/04/23, lyongde writes: 是这样的。
  • 2013/04/26, 新锦江娱乐城 writes: PHP小菜级别...我就不说话了
  • 2013/04/27, Anonymous writes: 膜拜。
  • 2013/04/27, abc writes: 膜拜。
  • 2013/04/28, PHP浮点数的一个常见问题的解答 | 午后小憩 writes: [...] 本文地址: http://www.laruence.com/2013/03/26/2884.html [...]
  • 2013/04/29, michael writes: 昨天定程序就遇到这个问题,旁边的同事给我解决明白了,没想到鸟哥也出来科普了。呵呵
  • 2013/04/29, xuanskyer writes: 鸟叔,0.58的二进制第一位不应该为1么?你说的“下面的数字省掉了隐含的1”是说第一位的1被省略?
  • 2013/04/30, PHP5.5或将引入Generators | 午后小憩 writes: [...] PHP浮点数的一个常见问题的解答 [...]
  • 2013/05/02, 让PHP更快的提供文件下载 | 午后小憩 writes: [...] PHP浮点数的一个常见问题的解答 [...]
  • 2013/05/02, Taint-0.3.0(A XSS codes sniffer) released | 午后小憩 writes: [...] PHP浮点数的一个常见问题的解答 [...]
  • 2013/05/07, IEEE754学习笔记 | 屌丝程序猿 writes: [...] PHP浮点数的一个常见问题的解答 [...]
  • 2013/05/08, 蚂蚁 writes: 这让我想起了一个基础的计算机试题,如果得到整数的算术平方根
  • 2013/05/08, vb2005xu writes: 为什么 只有 0.58 0.57 有这个问题呢
  • 2013/05/08, 霸气千秋 writes: 之前在群里边看过这个问题,受限于计算机的计算模式
  • 2013/05/13, 红色石头 writes: 新浪sae备案之后真是快啊,膜拜博客新浪首席...待业应届研究生~
  • 2013/05/16, 大饼 writes: 计算机里,浮点数一般都是近似值的。除了0.5,0.25,0.125这样的正好是2的整数幂分之一的书是精确的。
  • 2013/05/24, php&java Makes me cool » 小数怎么以二进制表示 writes: [...] Written by phpjava. Posted in 杂文分享 最近听到很多同事聊“浮点型”的数据好像经常会出现各种问题,在“Laruence”的PHP浮点数的一个常见问题的解答的博客中解释了这个东西,还是先说说小数如何用二进制表示的问题,后面具体说说浮点的问题 [...]
  • 2013/05/24, wclssdn writes: var_dump((0.8) * 10 == (0.1 + 0.7) * 10); //false 鸟哥. 这个是为啥啊? 求解答..
  • 2013/06/03, Beckham writes: 大大 会不会在新的php版本中 有所更新或者其他什么表现?
  • 2013/06/06, bliwy writes: perl对正则表达式的优化可以做到基于trie use Regexp::Optimizer; my $o = Regexp::Optimizer->new->optimize(qr/foobar|fooxar|foozap/); # $re is now qr/foo(?:[bx]ar|zap)/ php可以做到么?有没有对应的第三方包?
  • 2013/06/15, 小谈博客 writes: 那怎么才能算出准确的值呢?
  • 2013/06/15, 小谈博客 writes: 那怎么才能算出准确的值呢?
  • 2013/06/29, dog writes: your blog is word press Version 3.0.3 .
  • 2013/07/03, 知知了了 writes: 那为什么 var_dump(intval(0.58 * 1000));exit; 出来的不是579而是580呢? 求解。。。
  • 2013/07/03, 达达尼亚 writes: 其实也不是都这样,为了保险起见,是不是都要 先用 round函数一下啊?
  • 2013/07/05, Anonymous writes: 赞
  • 2013/07/24, 微历史 writes: 研究wp,想学点php,看到这么多人讨论的都是比较高深的
  • 2013/07/28, 於志远 writes: 这个对我帮助比较大,哈哈。谢鸟哥~
  • 2013/07/29, 耀眼 writes: www.szprovence.com液晶拼接 祝你越办越好
  • 2013/08/09, la recovery SaintSulpice et kid listing ont vu leur foree et leur g s writes: [...] went schoolfirer for due loiy door Jacques Chirac et Alain Juppé sont durante strength [ Découvrez ces challengers j virtual assistanthaud et ?a l'ensemble des faire planer geeks j parce que alfredia durantei [...]
  • 2013/08/28, PHP浮点数的一个常见问题的解答 | LAMP技术博客 writes: [...] 本文转自:?http://www.laruence.com/2013/03/26/2884.html?作者:laruence 分享到: document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000) [...]
  • 2013/08/28, zhaoyuhao writes: 对浮点数精度丢失的原因稍做补充 http://zhaoyuhao.com/notes/show/206
  • 2013/09/25, 养生指南 writes: 一直在用round的路过
  • 2013/10/22, 罗列php与众不同的小运算 | 次子小标 writes: [...] 这个具体解释,详见鸟哥博客PHP浮点数的一个常见问题的解答 [...]
  • 2013/10/23, Star writes: 最近的 php5.4 应该修复了吧?
  • 2014/08/24, seo Hitchin writes: Nice blog here! Alsso your site loads up fast! Whhat host are you using? Can I get your affilijate link to your host? I wish mmy site loaded up ass fast as yours lol Feel free to visitt my web site - seo Hitchin
  • 2014/09/05, PHP浮点数的一个常见问题 | 行云流水 writes: [...] 之前在项目做订单模块的时候,经常会出现xx.01等到厘的金额,这块就会有浮点的陷阱,别小看几厘哦,在基数比较大的支付情况下,将会是很大的数字。有篇文章分享下给大家,摘自:风雪之隅。 [...]

Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

<gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Nordhold : Fusion System, 설명
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 Apr 14, 2025 am 12:13 AM

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP 실행 : 실제 예제 및 응용 프로그램 PHP 실행 : 실제 예제 및 응용 프로그램 Apr 14, 2025 am 12:19 AM

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

PHP : 웹 개발의 핵심 언어 PHP : 웹 개발의 핵심 언어 Apr 13, 2025 am 12:08 AM

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 ​​있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP의 지속적인 관련성 : 여전히 살아 있습니까? PHP의 지속적인 관련성 : 여전히 살아 있습니까? Apr 14, 2025 am 12:12 AM

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.

PHP vs. Python : 차이점 이해 PHP vs. Python : 차이점 이해 Apr 11, 2025 am 12:15 AM

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP 및 Python : 코드 예제 및 비교 PHP 및 Python : 코드 예제 및 비교 Apr 15, 2025 am 12:07 AM

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.

PHP 대 기타 언어 : 비교 PHP 대 기타 언어 : 비교 Apr 13, 2025 am 12:19 AM

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP와 Python : 다른 패러다임이 설명되었습니다 PHP와 Python : 다른 패러다임이 설명되었습니다 Apr 18, 2025 am 12:26 AM

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

See all articles