Comparando el valor flotante en PHP

En PHP, el tamaño de los valores flotantes depende de la plataforma. Debido a la representación interna de los números de punto flotante, puede haber resultados inesperados al realizar o probar la igualdad de los valores de punto flotante. Por ejemplo, vea el siguiente programa.

PHP

<?php
 
// Declare valuable and initialize it
$value1 = 8 - 6.4;
$value2 = 1.6;
 
// Compare the values
if($value1 == $value2) {
    echo 'True';
}
else {
    echo 'False';
}
 
?>
Producción: 

False

 

Explicación: El resultado de este código es Falso, lo cual es muy impredecible, pero en PHP el valor 1 no es exactamente 1.6, es decir, proviene de la diferencia entre 8 y 6.4, que en realidad resultó ser 1.599999, por eso esta declaración resultó ser falsa. .

¿Cómo resolver el problema anterior?  
Método 1: para la prueba de igualdad en valores de punto flotante, use la máquina épsilon o podemos llamarla diferencia más pequeña en el cálculo en sistemas informáticos.

Programa 1:  

PHP

<?php
// PHP program to compare floating values
 
// Declare variable and initializing
// it by floating value
$value1 = 1.23456789;
$value2 = 1.23456780;
$epsilon = 0.00001;
 
// Use absolute difference and compare values
if(abs($value1 - $value2) < $epsilon) {
    echo "True";
}
else {
    echo "False";
}
 
?>
Producción: 

True

 

Explicación: en este código, use dos números de punto flotante value1 y value2 junto con epsilon . Ahora tome la diferencia absoluta de valores (valor1 y valor2) usando la función predefinida llamada abs() . Este código dará el valor absoluto, pero la pregunta es por qué estamos tomando los valores absolutos. Puede ver que ambos valores tienen los mismos dígitos después del decimal hasta el valor de precisión 7. Lo cual es muy difícil para el sistema analizar la comparación. 

Método 2: Podemos usar la función de ronda en PHP .  

PHP

<?php
// PHP program to compare floating values
 
// Declare valuable and initialize it
$value1 = 8 - 6.4;
$value2 = 1.6;
 
// Use round function to round off the
// floating value upto two decimal place
// and then compare it.
var_dump(round($value1, 2) == round($value2, 2));
 
?>
Producción: 

bool(true)

 

Publicación traducida automáticamente

Artículo escrito por Jitender_1998 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *