PHP乘法小数

时间:2014-11-21 17:54:07

标签: php decimal multiplication

当乘以小数时,我有一个奇怪的错误。当我将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

感谢。

3 个答案:

答案 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 ......