2014-01-20 20 views
4

我遇到了PHP的問題。 以下確切的減法是錯誤計算的。php減法145.48 - 80.26!= 65.22

<?php 

$test = 145.48 - 80.26; 

if($test != 65.22) 
    echo 'not good !'; 
else 
    echo 'good'; 

?> 

這回聲「不好」!

爲什麼?

+0

echo'test;'時輸出什麼? –

+1

浮點數二進制表示法問題。閱讀[**警告**部分](http://php.net/float)。 – BlitZ

+0

echo $ test; => 65.22 – Maloupi

回答

4

電腦是不是在存儲,因爲代表二進制基地10十進制數是硬浮點(十進制)的非常好。例如,如果您嘗試以二進制形式存儲數字0.2,則計算機將按照0.00110011&hellip模式存儲一系列數據; 。根據浮點數的大小(即在存儲器中分配了多少位),精度會有所不同,但更重要的是,它永遠不會準確地存儲0.2。

有幾種方法來解決這個問題,一個是使用BC數學庫,做這樣的事情:

bcsub("145.48", "80.26"); 

但有時更好的解決方案是隻承認數字不準確和帳戶對於錯誤,即

if (abs($x - $y) < $e) 

其中e是一些非常小的數,如10 ^( - 5)。在使用物理計算和類似計算時,這是常見的做法,但當然,在使用離散數字時,您絕對不應該嘗試使用這種方法。貨幣。

+0

*只是承認,數字將不準確*我不相信。電腦現在飛行太空飛船。 – DanFromGermany

+0

@DanFromGermany那麼,BC數學是準確的。可以達到完整的準確度,但是它會耗費您的時間和空間效率。 – kba

+0

這是幫助我理解這個問題的原因:計算'1/3'並存儲有限數字的解(例如寫在一張紙上)。乘以'3'看到的數字,就會得到'0.999999999'之類的東西。你沒有'1'的原因是導致你的PHP問題的原因。 – fero

1

要做到精確的浮點數運算,您可以使用bc_math

$test = bcsub("145.48", "80.26"); 
assert ($test == "65.22");