Bruno Augusto 417 Denunciar post Postado Março 21, 2010 Num cenário hipotético figuramos eu ter dois itens: A e B O item A possui um grau de qualidade 10 O item B possui um grau de qualidade 20 Como calcular o percentual diferencial entre as duas qualidades? Tentei com regra de 3, mas não ficou muito certo, eu acho. Trazendo a regra de três para programação teriamos que D = BC / A (sendo D a variável) no mesmo esquema que abaixo: A --- B C --- DJogando os valores pressupostos para discussão do algoritimo temos: 10 --- 100 % 20 --- x % 10x = 2000 x = 2000 / 10 x = 200 %E quando inverto: 20 --- 100 % 10 --- x % 20x = 1000 x = 1000 / 20 x = 50 %Até aí tudo bem. Mas como calcular o diferencial? Se eu subtrair, teria, comparando a qualidade: do item A -> B: 200 - 50 = 150 % do item B -> A: 50 - 200 = -150 % Mas como eu tiro a prova disso? Compartilhar este post Link para o post Compartilhar em outros sites
Pantoja 5 Denunciar post Postado Março 21, 2010 Nao entendi o que exatamente o programa quer com isso... "Como calcular o percentual diferencial entre as duas qualidades?" Como assim percentual diferencial? Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Março 22, 2010 Quantos % o primeiro item é melhor ou pior que o segundo. Usei o termo diferencial porque quando se subtrai uma coisa de outra, temos uma diferença como resultado. Eu bolei uma fórmula aqui para calcular isso exatamente no esquema postado: Faço a regra de três do A pelo B e do B pelo A e subtraio o A do B. Depois refiz a conta manualmente com o valor de A e com o valor de B para obter o resultados certo e ver se o algoritimo era funcional. Aparentemente funciona, mas queria confirmara lógica. Compartilhar este post Link para o post Compartilhar em outros sites
Pantoja 5 Denunciar post Postado Março 22, 2010 Bem nesse caso será sempre o dobro ou 200% pois uma é 10 e o outro 20. Seria interessante se o programa pedisse a qualidade do A e depois a qualidade do B e ai sim fizesse o calculo da porcentagem de um em relação ao outro. Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 22, 2010 , Sendo A e B dois valores variáveis: A <= 10 B <= 20 A comparação entre eles pode ser feita: AV <= A / B BV <= ( B / A ) - 1 Calculando: BV = ( 20 / 10 ) - 1 BV = 2 - 1 BV = 1 AV = 10 / 20 AV = 0.5 Sendo assim, B é (BV * 100) melhor que A ou 100% A é (AV * 100) de B ou 50% Para tirar a prova é simples também, PB = A + ( A * BV ) PB = 10 + ( 10 * 1 ) PB = 10 + 10 PB = 20 PA = B * AV PA = 20 * 0.5 PA = 10 Em PHP: <?php function calcula( $a , $b ){ if ( $a > $b ) $a ^= $b ^= $a ^= $b; return array( ( $a / $b ) * 100 , ( ( $b / $a ) - 1 ) * 100 ); } $a = 20; $b = 15; if ( $a > $b ){ vprintf( "B é %.02f%% de A\nA é %.02f%% maior que B\n" , calcula( $a , $b ) ); } else { vprintf( "A é %.02f%% de B\nB é %.02f%% maior que A\n" , calcula( $a , $b ) ); } A saída: B é 50.00% de A A é 100.00% maior que B ;) Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Março 22, 2010 Hmmm... Não sei não hein João. Joguei nessa sua função valores reais para $a e $b (84 e 88, respectivamente) e retornado, apesar de dentro do esperado pela função, não parece ser o real. Retornou: A é 95.45% de B B é 4.76% maior que A Eu fiz diferente: $diff = -round( ( ( ( 100 * $B ) / $A ) - 100 ) / 100, 2 );Em vermelho, minha interpretação da Regra de Três traduzida para programação.Em azul, apenas para retornar a porcentagem em decimal. Mexi com tantos algoritimos esse fim de semana que nem lembro de onde veio o -100. Acho que seria o valor de B na tradução da Regra de Três. E esse algoritimo me retorna 0.05 (5%) se A é melhor que B e o mesmo valor, porém negativo, se B for melhor que A. A sua retorna positivo em ambos os casos. Se A é melhor que B, um valor positivo deve ser retornado. Se B é melor que A algo negativo deveria resultar, concorda? Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 23, 2010 Hmmm... Não sei não hein João. Retornou: A é 95.45% de B B é 4.76% maior que A É só tirar a prova: <?php function calcula( $a , $b ){ if ( $a > $b ) $a ^= $b ^= $a ^= $b; return array( ( $a / $b ) * 100 , ( ( $b / $a ) - 1 ) * 100 ); } $a = 84; $b = 88; list( $c , $d ) = calcula( $a , $b ); var_dump( ( $b * $c ) / 100 , $a + ( ( $a * $d ) / 100 ) ); Saída: float(84) float(88) Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Março 23, 2010 Você não entendeu. A lógica está correta. Se você fizer e desfizer o processo os valores resultantes serão os mesmos. Acontece que não parece ser o certo entende? Porque ambas as análises retornam positivo, porém em quantidades diferentes. Eu vejo que, se A melhor que B,o resultado deve ser positivo. Caso contrário, o mesmo valor deve ser retornado, porém negativo. Meu algoritimo faz isso, mas não se é o mais adequado. Compartilhar este post Link para o post Compartilhar em outros sites
Mário Monteiro 179 Denunciar post Postado Março 31, 2010 Mas isso é apenas um detalhe pois está dando resultados iguais de forma diferente é o mesmo que dizer que o resultado não é 4 mas 2 elevado ao quadrado, é a mesma coisa usando os mesmos 84 e 88 temos pela logica usada pelo joão que vê os dois sentidos Retornou: A é 95.45% de B B é 4.76% maior que A E pela sua apenas vê um sentido o de A para B, mas na pratica é o mesmo Você precisa definir que informação deseja transmitir ao usuário final e formatar Compartilhar este post Link para o post Compartilhar em outros sites