PHP 浮點數的精度

2021-09-04 04:37:02 字數 1521 閱讀 2111

浮點數的精度有限。儘管取決於系統,php 通常使用 ieee 754 雙精度格式,則由於取整而導致的最大相對誤差為 1.11e-16。非基本數**算可能會給出更大誤差,並且要考慮到進行復合運算時的誤差傳遞。

此外,以十進位制能夠精確表示的有理數如 0.1 或 0.7,無論有多少尾數都不能被內部所使用的二進位制精確表示,因此不能在不丟失一點點精度的情況下轉換為二進位制的格式。這就會造成混亂的結果:例如,floor((0.1+0.7)*10) 通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9999999999999991118...。

所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度,應該使用任意精度數學函式或者 gmp 函式。

首先,給出乙個任意實數,整數部分用普通的二進位制便可以表示,這裡只說小數部分如何表示

例如0.6

文字描述該過程如下:將該數字乘以2,取出整數部分作為二進位制表示的第1位;然後再將小數部分乘以2,將得到的整數部分作為二進位制表示的第2位;以此類推,知道小數部分為0。 

特殊情況:小數部分出現迴圈,無法停止,則用有限的二進位制位無法準確表示乙個小數,這也是在程式語言中表示小數會出現誤差的原因

下面我們具體計算一下0.6的小數表示過程

0.6 * 2 = 1.2 ——————- 1 

0.2 * 2 = 0.4 ——————- 0 

0.4 * 2 = 0.8 ——————- 0 

0.8 * 2 = 1.6 ——————- 1 

0.6 * 2 = 1.2 ——————- 1 

…………

我們可以發現在該計算中已經出現了迴圈,0.6用二進位制表示為 1001 1001 1001 1001 …… 

如果是10.6,那個10.6的完整二進位制表示為 1010.100110011001……

$a = '9717.30' * 100;

var_dump((int) $a) ;

$a = '1717.30' * 100;

var_dump((int) $a) ;

var_dump(0.9-0.8-0.1);

var_dump(price_format((0.9-0.8-0.1)));

#這個輸出不是8 而是7,0.1在底層二進位制相當於 0.1

php浮點數精度警告

先出道題 echo intval 0.1 0.7 10 會輸出多少?8?7!在講為什麼前先再重溫一下php的int 整型 integer 的形式描述 decimal 1 9 0 9 0hexadecimal 0 xx 0 9a fa f octal 0 0 7 integer decimal hex...

PHP浮點數運算精度問題

最近有客戶反應 訂單金額總是不準確,總是相隔一分錢。檢查相關 邏輯都是正確的,就是運用了四則運算。大概推測問題可能出在浮點計算丟失精度。在 php程式設計師雷雪松的部落格 中寫過一篇關於js精度不準確的文章 js中浮點數運算不精準 下面php程式設計師雷雪松詳細的介紹一下如何解決php浮點數運算精度...

PHP 浮點數高精度運算

記錄下,工作中遇到的坑 關於 php 浮點數運算,特別是金融行業 電子商務訂單管理 資料包表等相關業務,利用浮點數進行加減乘除時,稍不留神運算結果就會出現偏差,輕則損失幾十萬,重則會有信譽損失,甚至吃上官司,我們一定要引起高度重視!加 a 0.1 b 0.7 c intval a b 10 echo...