Skip to content

Instantly share code, notes, and snippets.

@andersonfraga
Created September 15, 2011 20:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andersonfraga/1220404 to your computer and use it in GitHub Desktop.
Save andersonfraga/1220404 to your computer and use it in GitHub Desktop.
PHP e suas comparações
<?php
$x1 = (float) "111111111111111111111111111111111111111111111111111111112";
$x2 = (float) "111111111111111111111111111111111111111111111111111111111";
var_dump($x1);
var_dump($x2);
if($x1 == $x2){
echo "iguais";
}
else{
echo "diferentes";
}
/*
float 1.11111111111E+56
float 1.11111111111E+56
iguais
*/
<?php
$x1 = (float) "111111111111111111111111111111111111111111111111111111112";
$x2 = (float) "111111111111111111111111111111111111111111111111111111111";
var_dump($x1);
var_dump($x2);
if(bccomp($x1, $x2)) {
echo "iguais";
}
else{
echo "diferentes";
}
/*
float 1.11111111111E+56
float 1.11111111111E+56
diferentes
*/
<?php
$x1 = "111111111111111111111111111111111111111111111111111111112";
$x2 = "111111111111111111111111111111111111111111111111111111111";
var_dump($x1);
var_dump($x2);
if($x1 == $x2) {
echo "iguais";
}
else{
echo "diferentes";
}
/*
string '111111111111111111111111111111111111111111111111111111112' (length=57)
string '111111111111111111111111111111111111111111111111111111111' (length=57)
iguais
*/
<?php
$x1 = "111111111111111111111111111111111111111111111111111111112";
$x2 = "111111111111111111111111111111111111111111111111111111111";
var_dump($x1);
var_dump($x2);
if(similar_text($x1, $x2) === 0) {
echo "iguais";
}
else{
echo "diferentes";
}
/*
string '111111111111111111111111111111111111111111111111111111112' (length=57)
string '111111111111111111111111111111111111111111111111111111111' (length=57)
diferentes
*/
@augustohp
Copy link

Vamos aos "porquês":

float_a.php

Existe uma configuração no php.ini da precisão de números de ponto flutuante. Acima desse número, todos são arredondados.

float_b.php

Com a bcmath você não está comparando tipos especializados de dados, mas sim dados binários. É mais demorado, mas é extremamente preciso, sempre.

string_a.php

Quando você usa "==" você não compara os tipos, e não força o interpretador a respeitar o tipo de dado fornecido. O que acontece então!? O PHP converte o tipo para o tipo de dado mais apropriado em uma condição: boolean, inteiro, etc ...
Se você converter para inteiro, vai ver que os números são iguais.

string_b.php

Aqui sim você compara strings, garante que elas não sofram cast para outro tipo de dado. Você pode atingir isso usando "===" também, sem essa função de comparação de strings.

@igorescobar
Copy link

Boa!

@gpupo
Copy link

gpupo commented Sep 15, 2011

LIKE :D

@raphaeldealmeida
Copy link

Agora é só ===

@marcelomx
Copy link

Nice!

@andersonfraga
Copy link
Author

Excelente Augusto! :D

@felipernb
Copy link

Muito bom!
Agora a dica para as crianças que estão nos assistindo em casa é que não usem funções caras (O(n^3)) como similar_text ou levenshtein se tudo que você quer é saber se duas strings são iguais. Um === é bem mais barato (O(n) na implementação mais alto nível) e resolve esse problema :)

@augustohp
Copy link

@felipernb: Verdade. Assim como a bcmath! Apesar de sempre ser precisa não é necessária, é só o desenvolvedor ter cuidado (como nunca deveria ter deixado de ter) com os tipos de dado que esa manipulando.

Não é porque o PHP possui type-cast dinâmico que você deve ignorar os tipos de dado.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment