2011-06-15 57 views
0

<?php echo 199.8 + 0.9 -200.7; //expect 0, result 2.8421709430404E-14 ? ?>PHP加法減法操作,而不是精確的結果

測試在PHP版本5.3.2-1 ubuntu4.7

+1

有關於該[浮動PHP手冊頁]上一個很大的警示( http://php.net/manual/en/language.types.float.php),這被稱爲**浮點精度**。 – hakre 2011-06-15 10:41:52

回答

7

空間有限,分數浮動的一些值(只是以同樣的方式點is inaccurate那,用十進制表示法,你不能在有限空間中寫出1/3)。

2.8421709430404E-14非常接近於0。

圓形,或將其輸出到一定數量的顯著數字。

2

如果您需要精確的計算(例如貨幣交易),您應該使用BCD(二進制編碼的小數)或任意的精確數學。 PHP支持這個使用BC Math

+0

是的,但是使用bc函數有一些問題,例如我通過在H3llGhost下面回覆 – billoo 2011-06-15 11:19:02

0

這裏有一些http://www.php.net/manual/en/ref.bc.php確切的例子:

<?php 

$a = 199.8; 
$b = 0.9; 
$c = 200.7; 

// set precision 
bcscale(1); 

$ab = bcadd($a, $b); 
echo bcsub($ab, $c); // result 0.0 

?> 

測試與PHP 5.3.3-7 + squeeze1 Debian的擠壓

+0

回答評論,但是如果大於precoding示例,則應用bcadd會給出錯誤的值 $ precision = ini_get('precision')+ 2; (1/$ precision + pow(10,$ precision)); //正常添加將返回正確的數字,但沒有浮點數,返回1.0E + 16 但使用bc函數 bcadd(1/$ precision,pow(10,$ precision)); //此處將返回零 我在[PHP手冊BC函數](http://www.php.net/manual/en/ref.bc.php)中查看示例並進行測試 – billoo 2011-06-15 11:09:25

+0

您可以給出精度作爲最後一個參數,或者用bcscale全局設置它。還有一個bcpow。哪裏有問題?啊好吧...爲了你可以編寫你自己的計算器的精度:對於分和添加你可以採取最長的精度。對於div和mult,您必須計算兩個精度。 – CSchulz 2011-06-15 11:09:36

+0

確定子和添加和多我可以把一個特定的精度,因爲結果precission是已知的,但爲div的結果precission是未知的 – billoo 2011-06-15 11:14:41