php 浮點數運算

php -r "echo (0.1+0.7) == 0.8 ?'true':'false';"

瞭解浮點運算的都不難理解以上代碼運行時會得到false;這是因爲很多的10進制數都不能精確的轉成2進制,或如果要精確轉換的話需要的二進制數太長,會捨棄掉末尾部分,只保存一定的精度。

比如0.1(十進制)=0.0001100 1100 1100{n} ...,0.7=0.101100 1100 1100{n}.

這兩個數轉成2進制時是一個無線循環小數 1100 會無限循環。假設進度爲10位,那麼

0.1(十進制)= 0.00011 00110;

0.7(十進制) = 0.10110 01100;

0.1+0.7 =   0.11001 10010;

0.8(十進制) = 0.1100 1100 11;(1100{n})

精度到10位時已經發現相加的結果不一樣了,而默認的浮點數的精度比10大,所以0.1+07!=0.8;

但是精度位數小時,比如9位,就能得到正確的結果,0.1+0.7==0.8。這也給了一個解決浮點數運算時因爲精度問題導致得不到正確運算結果的方法,那就是控制精度。

但是具體控制到多少,還得依賴使用場景,一般來說不能小於原始數據的精度,運算進度再相對擴大一點,就能滿足要求了



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章