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);//0
http://php.net/manual/en/ref.bc.php