2011-04-07 66 views
4

我想我已經看了太久。爲什麼這個代碼打印'不',它應該打印'是'不應該嗎?我已經在PHP 5.3和PHP 5.2上嘗試過了,並且都打印出'不'。非常簡單的PHP添加問題

<?php 

$total = 14.05; 
$var1 = 0; 
$var2 = 0.11; 
$var3 = 13.94; 

if(($var1 + $var2 + $var3) == $total) 
{ 
    echo 'yes'; 
} 
else 
{ 
    echo 'no'; 
} 

?> 
+5

**從不**比較直接相等的浮點值。這裏有很多關於SO的問題。 – Jon 2011-04-07 14:38:00

+3

可能是相關的:[每個計算機科學家應該知道什麼關於浮點運算](http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html) – eldarerathis 2011-04-07 14:38:23

+1

看到這個:http: //stackoverflow.com/questions/3148937/compare-floats-in-php/3148991#3148991 – dusan 2011-04-07 14:38:38

回答

0

因爲..你要平等比不上彩車......這是一個四捨五入的問題...像14.05實際上是表示爲14.0499999 ......所有你能做的事情將有一定tolarence進行比較,例如t = 0.01,那麼如果a + t> = b> = a-t,a = b將被視爲真。

2

像其他人一樣,不要直接比較花車。 只是做一個 如果(ABS($ float1- $ FLOAT2)< 0.0000001)

或similair

在你的情況

<?php 

$total = 14.05; 
$var1 = 0; 
$var2 = 0.11; 
$var3 = 13.94; 

if (abs(($var1 + $var2 + $var3)-$total)<0.000001) 
{ 
    echo 'yes'; 
} 
else 
{ 
    echo 'no'; 
} 

?> 
0

我懷疑這是由於floating point precision

基本上浮點數不能以完全精度進行存儲,有時結果不符合您的期望。爲了比較浮點數,你應該允許一些容差。如果你確定每個數字都有兩個小數位,你可以乘以100來得到整數值,然後比較總數。

0

這是由浮點精度引起的。浮點數表示實際值,但僅表示一定的精度。而不是嘗試以下操作:解決此

<? 
$total = 14.05; 
$var1 = 0; 
$var2 = 0.11; 
$var3 = 13.94; 

if((($var1 + $var2 + $var3) > ($total - 0.0000001)) && (($var1 + $var2 + $var3) < ($total + 0.0000001))) 
{ 
    echo 'yes'; 
} 
else 
{ 
    echo 'no'; 
} 
?> 
1

一個很懶惰的方式:

$var4 = $var1 + $var2 + $var3; 
$var4 = number_format($var4, 2); 
$total = number_format($total, 2); 

if($var4 == $total) 
{ 
    echo 'yes'; 
} 
else 
{ 
    echo 'no'; 
} 

http://php.net/number_format

0

這是一個基本的浮點數學問題。

電腦使用二進制數學運算。對於整數值,沒有問題。但是對於小數,它使用了一種稱爲浮點數學的技術。麻煩的是,雖然浮點數是好的,但不要直接映射到十進制值;即使相對簡單的十進制值可能也無法用二進制精確表示。

如果您總是使用兩位小數 - 例如對於貨幣 - 將整個值作爲整數處理通常是一個更好的主意(例如,存儲美分而不是美元,或便士而不是磅),以便所有你的數學是用整數完成的,結果是準確的。你只需要它作爲顯示目的的小數,你可以在你需要的時候做。

1

如果您需要做精確的浮點運算了很多,它使用庫像GMPBCMath

0

浮點值具有有限的精確度的價值。因此,值可能 任何處理後不具有相同的字符串表示形式。這也 包括寫在你的腳本中的浮點值,並直接打印它沒有任何數學運算。

如果您想了解更多關於「花車」,什麼IEEE 754,讀這樣的:

http://docs.sun.com/source/806-3568/ncg_goldberg.html

可以使用number_formattig或字符串鑄造comperation

1

之前,正如上文其他答案,比較浮動時要小心。試試這個:

echo ((int)(($var1+$var2+$var3)-$total)==0)?"yes":"no";