当乘以小数时,我有一个奇怪的错误。当我将2.1之类的十进制乘以2之类的数字(得到产品4.2)时,PHP会以相同的方式显示它们,相比之下,它们将它们显示为相等。但是当我将2.1乘以7(14.7)时,虽然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 :(得分: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>";
答案 1 :(得分: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
答案 2 :(得分:0)
这是PHP,兄弟! 只需将您的浮动转换为字符串并进行比较......
$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
......