浮點計算精度

來源:互聯網
上載者:User
1.背景描述:在php代碼中echo(10 - 9.8 - 0.2);會返回一個近似於0但又不是0的數,我看到很多部落格也大篇幅地解釋為什麼計算後精度會丟失,就是說二進位儲存這些浮點數會失真,只能近似儲存。
2.引出問題:那麼問題來了,如何避免顯示的時候看到這個問題,比如避免你的銀行賬戶裡的餘額總不能顯示你的金額是0.000000001吧。各位有什麼好的解決辦法嗎?
3.暫用方法:我目前只是簡單的用round去取整,但是所有的計算我都要這麼去處理了覺得挺麻煩的,怎麼辦?

回複內容:

1.背景描述:在php代碼中echo(10 - 9.8 - 0.2);會返回一個近似於0但又不是0的數,我看到很多部落格也大篇幅地解釋為什麼計算後精度會丟失,就是說二進位儲存這些浮點數會失真,只能近似儲存。
2.引出問題:那麼問題來了,如何避免顯示的時候看到這個問題,比如避免你的銀行賬戶裡的餘額總不能顯示你的金額是0.000000001吧。各位有什麼好的解決辦法嗎?
3.暫用方法:我目前只是簡單的用round去取整,但是所有的計算我都要這麼去處理了覺得挺麻煩的,怎麼辦?

程式裡的浮點數計算都是近似的,作為程式員,我們應該永遠不要指望得到的結果是精確的,所以計算之前要搞清楚精度要求。舉個例子,即使是計算太陽系的直徑,當π精確到小數點後面十幾位時,計算出來的半徑誤差也只有幾厘米了。

就金額來說,有些語言對金額有專有的資料類型。其他的語言就自己控制,例如金額一般只需要精確到小數點後2位就可以了。還有一種處理金額的方法是儲存到分,例如1元錢儲存為100分,顯示的時候再處理成元來顯示,這樣計算的時候就只需涉及到整數即可。

這種問題太泛濫了,網上搜一下就可以得到答案。關於浮點數之間的加減乘數得出來的結果想要絕對的精確,目前是不太可能的。

你可以藉助 PHP 的 BC 高精確度函數庫。用這個庫的好處就是你可以控制至少精確到的位元,而不至於失控。請參考 PHP 手冊。

echo bcsub(10-9.8-0.2,0);//0http://php.net/manual/en/ref.bc.php

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.