您現在的位置是:電腦技術吧?>? 編程技術 ??>??四精度浮點數,浮點數的精度由??>??正文詳情

四精度浮點數,浮點數的精度由

向彭湃2019-12-12 22:42:11 人圍觀
簡介雙精度浮點數本文主要介紹PHP浮點精度問題的綜述。本文主要研究PHP浮點精度損失問題。它從三個不同的方面解釋了這個問題的原因和解決方法。對于您的朋友,請參閱下一節,PHP浮浮

這篇文章主要介紹了PHP浮點數精度問題匯總,本文著重探討PHP浮點數精度損失問題,用三個段落不同的方式講解了這個問題的形成原因以及解決方法,需要的朋友可以參考下  一、PHP浮點數精度損失問題  先看下面這段代碼:   代碼如下:  $f = 0.57;  echo intval($f * 100); //56  結果可能有點出乎你的意外,PHP遵循IEEE 754雙精度:  浮點數, 以64位的雙精度, 采用1位符號位(E), 11指數位(Q), 52位尾數(M)表示(一共64位).  符號位:最高位表示數據的正負,0表示正數,1表示負數。

  指數位:表示數據以2為底的冪,指數采用偏移碼表示  尾數:表示數據小數點后的有效數字.  再來看看小數用二進制怎么表示:  乘2取整,順序排列,即將小數部分乘以2,然后取整數部分,剩下的小數部分繼續乘以2,然后取整數部分,剩下的小數部分又乘以2,一直取到小數部分,但是像0.57這樣的小數像這樣一直乘下去,小數部分不可能為0.有效位的小數用二進制表示卻是無窮的。

  0.57的二進制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101  如果只有52位的話,0.57 = 0.56999999999999995  不難看出上面意外的結果了吧。

  二、PHP浮點數的精度問題  先看問題:   代碼如下:  $f = 0.58;  var_dump(intval($f * 100)); //為啥輸出57  我相信有很多的同學有過這樣的疑問。

  具體原理可閱讀鳥哥的一篇文章,那里有詳細的解說:PHP浮點數的一個常見問題的解答  那么如何避免這種問題呢?  辦法有很多,這里列舉兩個:  1. sprintf   代碼如下:  substr(sprintf(%.10f, ($a/ $b)), 0, -7);  2. round (注意會進行四舍五入)   代碼如下:  round($a/$b, 3);  或者你有更好的辦法,也可以了留言告訴我。

  三、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上經常有人問  要搞明白這個原因, 首先我們要知道浮點數的表示(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了, 這就是這樣的..

版權聲明:本文由 向彭湃 整理編輯。

原標題:半精度浮點數,最大浮點數精度

轉載注明出處:http://www.dn9ww09s.icu/program/15381.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • asp連數據庫,asp與數據庫

    asp連數據庫,asp與數據庫 相關圖片asp訪問數據庫過程本文主要介紹了asp.net數據庫備份與恢復的方法示例,需要的朋友可以參考以下代碼:/*************************************net讀取數據庫...

  • asp生成文件夾,asp文件夾瀏覽

    asp生成文件夾,asp文件夾瀏覽 相關圖片asp.netmvc文件夾%設置FSO=Server.CreateObject(Scripting.FileSystemObject)設置服務器文件夾=FSO.GetFolder(Sernet文件夾...

  • php 數據庫,php對mysql進行增刪

    php 數據庫,php對mysql進行增刪 相關圖片最簡單的php查詢數據庫PDO是MySQL數據庫操作的一個公共類。我們可以直接使用PDO操作數據庫,而不必定義類。但是,在PHP默認配置中沒有啟用PDO,因此在使用它之前,必須在PHPphp關閉數據...

  • asp網站代碼,簡單的webasp

    asp網站代碼,簡單的webasp 相關圖片站內短信 asp源碼!--吡含含含asp 開發...

  • ajax sqlserver,jquerysql注入

    ajax sqlserver,jquerysql注入 相關圖片jsp防止sql注入本文主要介紹了asp.net Ajax SQL Server的自動完成功能。對于您的朋友,請參考下面的代碼下載說明:數據庫連接字符串在web.config文件中sql有什么用...

  • 循環增加json節點,識別json節點數量

    循環增加json節點,識別json節點數量 相關圖片java遍歷json我們之前已經解釋了使用JavaScript獲取JSON數據節點路徑的問題。今天我們將更進一步。我們來談談如何通過PHP獲取JSON數據的所有節點路徑?12345c# json...

  • asp導出excel,asp導出到excel

    asp導出excel,asp導出到excel 相關圖片asp導出exl本文主要介紹了asp.net導出excel的簡單方法實例。你可以給你的朋友參考Excel的操作。最常用的方法是導出和導入。關于密碼沒有太多的胡說八道。這個例子是aspose導出excel亂碼...

  • 這件事使我苦惱,什么使我煩惱

    這件事使我苦惱,什么使我煩惱 相關圖片考試使我苦惱作文450PHP編程中的中文編碼問題一直困擾著許多人。這個問題的原因很簡單。每個國家(地區)都規定了計算機信息交換的字符編碼集,如美國的擴展ASCII碼、中國的GB231最...

  • artifact在線人數,全球在線人數最多的游戲

    artifact在線人數,全球在線人數最多的游戲 相關圖片在線人數最多的網友Global.asa是一個文本文件,可以找到您的主目錄(/Global.asa)。Lou將基本結構顯示為global.as a文件。global.asa腳本語言騰訊在線人數提前...

  • querystring傳值,parsequerystring

    querystring傳值,parsequerystring 相關圖片vuequerystring當您從HTML表單傳遞信息時,使用get方法從ASP頁面處理它,并且您可以使用ASP的querystring集合檢索數據。在過去,我們創建tizagform.hquerystringpost...

熱評文章

  • Java常用框架,常用的web開發框架

    Java常用框架,常用的web開發框架 相關圖片android框架自從接觸到PHP開發以來,已經使用了許多框架。雖然沒有對每個框架進行深入的研究,但是對使用的每個PHP框架函數都有一定的了解。在這一點上,我將把一些常用的PHP常見的...

  • deleteinsert,update和insert

    deleteinsert,update和insert 相關圖片電腦insert是什么意思本教程是對ASP的介紹。主要介紹了ASP訪問插入更新刪除的簡單使用。好的,我們把它們寫進一個函數中,并給出一個例子。函數add_del_update(tableinsert鎖表嗎...

  • asp制作網站,asp制作網站教程

    asp制作網站,asp制作網站教程 相關圖片做網頁用asp純ASP創建的日歷程序,可以美化自己,這里只提供最簡單的CSS樣式。。。樣式體{字體大小:12px;邊距:20px 0 0 20px;填充:0}tr,td{文本asp編寫工具...

  • php7,php實例

    php7,php實例 相關圖片php socket本文通過一個實例說明PHP如何自動地改變每天的隨機問候語。與您分享以供參考。具體分析如下:這里預先定義了一個PHP數組,其中存儲了一些隨機的問候語。打電話時,它php消...

  • c 字符串長度,字符串長度怎么數

    c  字符串長度,字符串長度怎么數 相關圖片字符串比較大小SP judge中西方混合字符串的長度==================函數名:string length action:judge string lengtjava字符串長度...

  • kafkastream函數,stringstream的用法

    kafkastream函數,stringstream的用法 相關圖片stream groupby本文主要介紹PHP stream﹣context﹣create()函數的使用示例。Stream﹣context﹣create()函數用于創建打開文件的上下文件選stringstream頭文件...

  • 用流,免流如何使用

    用流,免流如何使用 相關圖片幽諾每次使用后全流出來本文主要介紹PHP流的詳細介紹和使用。phpstream是一個內置的核心操作,普通開發人員很少使用它。它用于統一文件、網絡、數據壓縮等類文件操作,并為這些類...

  • flash與ae能結合,PS和flash結合

    flash與ae能結合,PS和flash結合 相關圖片ps做flashflash LoadVars函數加載ASP頁面,將變量傳遞給頁面,首先讀取記錄,然后加載更新頁面。例如,update.asp?用戶名=?pass=?dim sops flash...

  • java split函數,split函數分割

    java split函數,split函數分割 相關圖片vba split函數用法%STR1應該處理哪些字符?讓我們看一個字符:item u tempcontent=split(sp'u tempcontent,)/})(0)這里是vb split函數用法...

  • 顯示適配器代碼43,什么是適配器模式

    顯示適配器代碼43,什么是適配器模式 相關圖片適配器認證本文主要介紹PHP設計模式的適配器模式代碼示例。本文闡述了目標、角色、應用場景、優點等內容,并給出了代碼示例。需要的朋友可以參考以下目標:可以將一個類的接口...

關注微信

变脸官网查询