国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > PHP > 正文

PHP浮點(diǎn)數(shù)的一個(gè)常見(jiàn)問(wèn)題

2024-05-04 21:58:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在php中浮點(diǎn)數(shù)是一個(gè)非常有用的數(shù)據(jù)類型了,但是他同樣也給我們帶來(lái)很多的細(xì)節(jié)問(wèn)題,下面我來(lái)舉個(gè)實(shí)例來(lái)分析PHP浮點(diǎn)數(shù)的一個(gè)常見(jiàn)問(wèn)題.

先看看這段代碼:

  1. <?php 
  2.     $f = 0.58; 
  3.     var_dump(intval($f * 100)); //為什么輸出57 
  4. ?> 

為什么輸出是57?

我相信有很多的同學(xué)有過(guò)這樣的疑問(wèn),Vevb.com上經(jīng)也常有人問(wèn),要搞明白這個(gè)原因,首先我們要知道浮點(diǎn)數(shù)的表示(IEEE 754):

浮點(diǎn)數(shù),以64位的長(zhǎng)度(雙精度)為例,會(huì)采用1位符號(hào)位(E),11指數(shù)位(Q),52位尾數(shù)(M)表示(一共64位).

符號(hào)位:最高位表示數(shù)據(jù)的正負(fù),0表示正數(shù),1表示負(fù)數(shù).

指數(shù)位:表示數(shù)據(jù)以2為底的冪,指數(shù)采用偏移碼表示.

尾數(shù):表示數(shù)據(jù)小數(shù)點(diǎn)后的有效數(shù)字.

這里的關(guān)鍵點(diǎn)就在于,小數(shù)在二進(jìn)制的表示,關(guān)于小數(shù)如何用二進(jìn)制表示,大家可以百度一下,我這里就不再贅述, 我們關(guān)鍵的要了解, 0.58 對(duì)于二進(jìn)制表示來(lái)說(shuō), 是無(wú)限長(zhǎng)的值(下面的數(shù)字省掉了隱含的1)..

0.58的二進(jìn)制表示基本上(52位)是:

0010100011110101110000101000111101011100001010001111

0.57的二進(jìn)制表示基本上(52位)是:

0010001111010111000010100011110101110000101000111101

而兩者的二進(jìn)制, 如果只是通過(guò)這52位計(jì)算的話,分別是:

0.58 -> 0.57999999999999996

0.57 -> 0.56999999999999995

至于0.58 * 100的具體浮點(diǎn)數(shù)乘法,我們不考慮那么細(xì),有興趣的可以看(Floating point),我們就模糊的以心算來(lái)看… 0.58 * 100 = 57.999999999

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

可見(jiàn),這個(gè)問(wèn)題的關(guān)鍵點(diǎn)就是:“你看似有窮的小數(shù),在計(jì)算機(jī)的二進(jìn)制表示里卻是無(wú)窮的”

so,不要再以為這是PHP的bug了,這就是這樣的.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 芮城县| 澄江县| 镇康县| 江油市| 蓬莱市| 巴东县| 荃湾区| 新泰市| 大埔区| 康乐县| 上饶市| 河源市| 乐业县| 沁阳市| 龙游县| 万全县| 宜兰县| 咸阳市| 汉沽区| 宣城市| 婺源县| 会理县| 安国市| 郸城县| 格尔木市| 鲁山县| 甘德县| 云林县| 华蓥市| 彰化市| 扎兰屯市| 砚山县| 天门市| 揭阳市| 抚远县| 铁岭县| 宾阳县| 轮台县| 绥棱县| 西安市| 宁波市|