Esse й daquele tipo de tуpico que gosto de fazer uma daquelas fodendo explicaзхes, entгo vamos lб.
Vou usar como exemplo, uma possнvel "falha" do PHP que geralmente os que realmente nгo entendem o processo de tipagem de dados dinвmica dela costumam criticar, sendo que na verdade isso й uma falha dos mesmos.
Em PHP, se vocк
comparar qualquer string com 0, o valor de retorno vai ser verdadeiro.
PHP код:
if("string" == 0) // O valor dessa condicional sempre serб verdadeiro
Isso entгo й uma falha da linguagem? Nгo necessariamente.
PHP й dinamicamente tipado, ou seja, vocк pode fazer este tipo de coisa:
PHP код:
$oi = "Teste";
$oi = 1450;
Que o prуprio interpretador faz um type casting implнcito, a fim de transformar a variбvel em um dado inteiro.
Ok. E daн?
E daн, que quando vocк faz aquela comparaзгo de qualquer string com 0, o interpretador faz primeiro um type casting de string para inteiro antes de tudo, para depois uma possнvel atribuiзгo. E qual a melhor forma do interpretador fazer isto? Qual valor ele deve pre-inicializar para essa nova variбvel inteira? O valor 0.
Resumidamente, й basicamente assim:
PHP код:
if("Dolby" == 0) //Primeiramente o interpretador precisa converter os dados para tipos inteiros
if(0 == 0) // E como citei, se vocк converter *QUALQUER* string para inteiro, ela assume o valor 0(start point, digamos assim).
*: Caso a string comece por um inteiro, algo como
2Dolby, seu valor do casting implicito para inteiro, seja 2.
Faзa o
teste:
PHP код:
if("Dolby" == 0) echo "Dolby Verdadeiro";
if("2Dolby" == 0) echo "2Dolby Verdadeiro"; // Essa condicional serб falsa
Exatamente por este motivo que o PHP tem um operador que leva em consideraзгo, o tipo de dado, chamado de strict equals ( === ). Sim, sгo 3 iguais.
PHP код:
if('1' == 1) //Verdadeiro
if('1' === 1) //Falso
O que aconteceu no seu cуdigo foi exatamente isto. Vocк dividiu
60 por 1, que resultou em
60, no entanto, como utilizou o placeholder
%f, vocк obrigou o compilador a fazer um type casting implнcito de
inteiro para
float , que como foi citado acima, assume o "start point", valor 0.
E como burlar isto? Trate os valores, como floats, assim como foi citado pelo
Leonardo.
PHP код:
printf("Float: %f", float(60)/float(50));
Espero que tenha sido ъtil.
Abraзos.