2012-07-03 89 views
0

我相信這是因爲最終的「g」,但這是當我嘗試計算比例百分比時的場景和結果。我總是希望將最低的2個數字除以最低。PHP:最大和最小返回不正確的結果

$item1 = "200.00g"; 
$item2 = "50.00g"; 
$calc = round((max($item1,$item2)/min($item1,$item2))*100) . "%"; 
// result: $calc = "400%" 

$item1 = "100.00g"; 
$item2 = "5.00g"; 
$calc = round((max($item1,$item2)/min($item1,$item2))*100) . "%"; 
// result: $calc = "2000%" 

PROBLEM RESULT: 
$item1 = "8.00g"; 
$item2 = "14.00g"; 
$calc = round((max($item1,$item2)/min($item1,$item2))*100) . "%"; 
// result: $calc = "57%" 
// I am expecting (14.00g/8.00g)*100 = "175%" 
+2

恩,你知道你在比較兩個*串*,對嗎? –

+1

需要刪除'g'... –

+0

順便說一句,第二個片段給了我5%,而不是2000%。它是正確的,因爲「5.00g」大於「100.00g」。 – raina77ow

回答

2

這是類型鑄造;

$item1 = "8.00"; 
$item2 = "14.00"; 
$calc = round((max($item1,$item2)/min($item1,$item2))*100) . "%"; 

結果將是175%

+0

錯誤是cuz max($ item1,$ item2) - >返回「8.00g」 – pomaxa

0

用途:SUBSTR($物品1,0,-1)的$物品1 instade,SUBSTR($ ITEM2,0,-1)的$ ITEM2 instade當你做圓。

你不能用round()比較2個字符串。

編輯:如果$ item1 =「200g」,ma解決方案沒問題,但是如果$ item1 =「200.00g」則需要移除「。」。在例如pregreplace之前的round()之前。

2

當你想用你的字符串中的數學運算,你知道該單元被放置在年底,因爲它是你的榜樣,你可以投你的變數到彩車:

$item1_numeric = (float) $item1; 

但很明顯,最好是有價值觀和你的變量/數據庫分離的單位。

0

哦,YAPHPB - 和我最喜歡的之一。雖然這是寫在the Doc

When [max()] given a string it will be cast as an integer when comparing. 

...這只是一個局部的真理:如果比較值的至少一個是數字,或數字字符串。

否則所有的字符串會相比字符串:第一{0}每個字符串的字符進行比較,那麼{1},然後{2} ...等

所以基本上這就是發生在這裏:

echo max("200.00g", "50.00g"); // 50.00g, as '5' > '2' 
echo max("200.00g", 50);  // "200.00g", as it gets converted to int (become 200) 

而這更瘋狂:

echo max("200.00g", "1000.00"); // "200.00g", as '2' > '1' 
echo max("200.00", "1000.00"); // "1000.00", as we tried to help you, no, really! 

後者的結果實際上可以被人知道的012預測概念:當兩個字符串都是純數字時,它們在比較時轉換爲數字。儘管如此,我發現這種行爲不可靠,至少可以說。

底線:如果您需要比較數字,比較數字,句點。在PHP中進行類型轉換可能會變得非常混亂 - 並且在最不經意的時候會讓你陷入困境。 )