PHP умножение десятичных дробей

У меня странная ошибка при умножении десятичных чисел. Когда я умножаю десятичное число, такое как 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

Решение

Проблема в том, что некоторые числа с плавающей точкой не могут быть представлены точно. Если вам нужно сравнить их или более высокий уровень точности, используйте 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

Другие решения

Я предлагаю вам использовать 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
1

Это 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 как показано выше …

0
По вопросам рекламы [email protected]