2014-11-21 83 views
0

當乘以小數時有一個奇怪的錯誤。當我將諸如2.1之類的小數乘以2等數字(以獲得產品4.2)時,PHP將以相同的方式顯示它們,並且通過比較,將它們顯示爲相等。但是,當我乘以2.1乘以7(14.7),儘管PHP仍然將它們顯示爲相等,但經過比較後,它聲明產品不相等。PHP乘法小數點

這裏的說明問題(注意PHP返回什麼)代碼:

$num_1 = 4.2; 
$num_2 = 2.1*2; 
if($num_1 == $num_2){ 
    $eq = "Equal"; 
}else{ 
    $eq = "Unequal"; 
} 
echo $num_1.", ".$num_2.", ".$eq."<br>"; 
// Returns 4.2, 4.2, Equal 

$num_1 = 14.7; 
$num_2 = 2.1*7; 
if($num_1 == $num_2){ 
    $eq = "Equal"; 
}else{ 
    $eq = "Unequal"; 
} 
echo $num_1.", ".$num_2.", ".$eq."<br>"; 
// Returns 14.7, 14.7, Unequal 

感謝。

+0

歡迎來到[浮點運算](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)的樂趣! – Powerlord 2014-11-21 17:56:18

回答

1

問題是某些浮點數不能準確表示。如果您需要比較它們或更高級別的精度,請使用bcmul

$num_1 = 14.7; 
$num_2 = bcmul(2.1, 7, 1); 
if((string)$num_1 == $num_2){ 
    $eq = "Equal"; 
}else{ 
    $eq = "Unequal"; 
} 
echo $num_1.", ".$num_2.", ".$eq."<br>"; 
+0

假設php(在* nix上)是用'--enable-bcmath'編譯的。 – Devon 2014-11-21 18:11:00

+0

我認爲這可能是最好的正式途徑,謝謝。由於我不會涉及的原因,我需要有一個數字值,而不是一個字符串,所以我實際上使用了下面建議的全面解決方案。 – 2014-11-21 22:36:34

0

這是PHP,bro! 只需將您的花車爲字符串,並比較他們...

$num_1 = 14.7; 
$num_2 = 2.1*7; 
if((string) $num_1 == (string) $num_2){ 
    $eq = "Equal"; 
}else{ 
    $eq = "Unequal"; 
} 
echo $num_1.", ".$num_2.", ".$eq."<br>"; 

,或者使用bcmul如上圖所示...

1

我建議你使用round()

$num_1 = round(14.7, 2); 
$num_2 = round(2.1 * 7, 2); 
echo ($num_1 == $num_2) ? 'equal' : 'uequal'; 

現在注意結果在這裏究竟發生了什麼。

$num_1 = 14.7; 
$num_2 = 2.1 * 7; 
echo abs($num_1-$num_2); //Output: 1.7763568394003E-15 
+0

謝謝。我將最終使用我相信的解決方案。欣賞它。 – 2014-11-21 22:35:52

+0

歡迎您!樂意效勞。 – MH2K9 2014-11-22 00:21:38