我遇到了PHP的問題。 以下確切的減法是錯誤計算的。php減法145.48 - 80.26!= 65.22
<?php
$test = 145.48 - 80.26;
if($test != 65.22)
echo 'not good !';
else
echo 'good';
?>
這回聲「不好」!
爲什麼?
我遇到了PHP的問題。 以下確切的減法是錯誤計算的。php減法145.48 - 80.26!= 65.22
<?php
$test = 145.48 - 80.26;
if($test != 65.22)
echo 'not good !';
else
echo 'good';
?>
這回聲「不好」!
爲什麼?
電腦是不是在存儲,因爲代表二進制基地10十進制數是硬浮點(十進制)的非常好。例如,如果您嘗試以二進制形式存儲數字0.2,則計算機將按照0.00110011&hellip模式存儲一系列數據; 。根據浮點數的大小(即在存儲器中分配了多少位),精度會有所不同,但更重要的是,它永遠不會準確地存儲0.2。
有幾種方法來解決這個問題,一個是使用BC數學庫,做這樣的事情:
bcsub("145.48", "80.26");
但有時更好的解決方案是隻承認數字不準確和帳戶對於錯誤,即
if (abs($x - $y) < $e)
其中e
是一些非常小的數,如10 ^( - 5)。在使用物理計算和類似計算時,這是常見的做法,但當然,在使用離散數字時,您絕對不應該嘗試使用這種方法。貨幣。
*只是承認,數字將不準確*我不相信。電腦現在飛行太空飛船。 – DanFromGermany
@DanFromGermany那麼,BC數學是準確的。可以達到完整的準確度,但是它會耗費您的時間和空間效率。 – kba
這是幫助我理解這個問題的原因:計算'1/3'並存儲有限數字的解(例如寫在一張紙上)。乘以'3'看到的數字,就會得到'0.999999999'之類的東西。你沒有'1'的原因是導致你的PHP問題的原因。 – fero
要做到精確的浮點數運算,您可以使用bc_math
:
$test = bcsub("145.48", "80.26");
assert ($test == "65.22");
echo'test;'時輸出什麼? –
浮點數二進制表示法問題。閱讀[**警告**部分](http://php.net/float)。 – BlitZ
echo $ test; => 65.22 – Maloupi