Calculo errado

Tenho dois campos do tipo inteiro e um campo do tipo float, estou tentado fazer o seguinte: campo float = (campo inteiro * 100) / campo inteiro, até ai tudo bem, em tempo de execução me mostra por exemplo 7,1 (correto) so que no banco grava 0,7(errado). segue o codigo utilizado:

// calcula percentual de escoria
sc_lookup(ds1,“SELECT raspa_total,liga_bruta FROM corridas
WHERE id_codigo=’{id_codigo}’”);
if ({ds1}[0][0] > 0 ) {
$per_esc=({ds1}[0][0] * 100) / {ds1}[0][1];
$per_esc = number_format($per_esc,1);
sc_master_value(‘per_escoria’,$per_esc);
$per_esc=({ds1}[0][0] * 100) / {ds1}[0][1];
$per_esc = number_format($per_esc,1);
sc_exec_sql(“UPDATE corridas SET per_escoria = ‘.$per_esc.’
WHERE id_codigo =’{id_codigo}’”);
}

Boa tarde,

Tente por gentileza verificar se o valor da variável é de fato 7,1.

// calcula percentual de escoria
sc_lookup(ds1,“SELECT raspa_total,liga_bruta FROM corridas
WHERE id_codigo=’{id_codigo}’”);
if ({ds1}[0][0] > 0 ) {
$per_esc=({ds1}[0][0] * 100) / {ds1}[0][1];
$per_esc = number_format($per_esc,1);
sc_master_value(‘per_escoria’,$per_esc);
$per_esc=({ds1}[0][0] * 100) / {ds1}[0][1];
$per_esc = number_format($per_esc,1);
echo $per_esc;
sc_exec_sql(“UPDATE corridas SET per_escoria = ‘.$per_esc.’
WHERE id_codigo =’{id_codigo}’”);
}

Duas situações:

  1. Para o banco de dados:
    Cuidado com campos float eles sofrem arredodamentos inesperados principalmente quando armazenados no banco de dados.
    Para o mysql veja: http://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html
    No Mysql, firebird e etc é necessário saber bem os tipos trabalhados para não gerar surpresas.
    Isto já foi discutido aqui:
    http://www.netmake.com.br/forum/index.php/topic,4114.msg16344.html#msg16344
    Espero que o erro seja apenas na escolha dos tipos e não um bug ou erro no valor da variável.
  2. Para o PHP
    Aproveito e lembro que diferente do Pascal que é um linguagem tipada o PHP é uma linguagem não tipada.
    Logo, se não tomar cuidado com a varíaveis e os valores assumidos os resultados podem ficar “loucos”.
    Dê uma olhada no: http://www.php.net/manual/pt_BR/language.types.type-juggling.php e seus sublinks para referência.
    Em especial no: http://www.php.net/manual/pt_BR/language.types.float.php#language.types.float.casting
    Onde se lê um aviso bem grande em vermelho.

[b]"Aviso
Precisão de números de ponto flutuante

É típico que frações simples como 0.1 ou 0.7 não podem ser convertidos em sua representação binária interna sem uma pequena perda de precisão. Isto pode causar erros confusos: por exemplo, floor((0.1+0.7)*10) irá retornar 7 em vez do esperado 8, como resultado da representação interna realmente ser algo como 7.9999999999…

Isto está relacionado ao fato de que é impossível expressar, exatamente, algumas frações em notação decimal com um número finito de dígitos. Por exemplo, 1/3 na forma decimal se torna 0.3333333. . …

Então, nunca confie em resultados com números de ponto flutuante até a última casa e nunca compare números de ponto flutuante em igualdades. Se você realmente precisar de alta precisão, você pode utilizar as funções matemáticas de precisão arbitrária ou as funções relacionadas ao gmp."
[/b]

Eu pessoalmente acho que se um campo float vai receber uma operação é bom que os operadores sejam float para evitar corrupções de valores nas variáveis tratadas pelo php.

Uma aula…parabéns!! E muito bem lembrado!!

Agradeço a todos pelas respostas. Estou refazendo todo o sistema antigo que tinha em php para o scriptcase, o que me chama a atenção que no antigo funcionava, segue o código do calculo:

$per_escoria_ = (($raspa_total*100)/$liga_bruta);
//comando para retirar casas decimais do valor , assim fica apenas uma casa depois da virgula
$per_escoria = number_format($per_escoria_,1);

Como aproveitei todas as tabelas do sistema antigo, pode ser que seja um bug do scriptcase.

Como exemplo tenho gravado no banco:

Raspa_total = 100
Liga_bruta = 4000
variavel = (100 * 100) / 4000 = 2,5 justamente o que esta gravado no banco conforme sistema anterior

ja no scritptcase
variavel = (100 * 100)/4000 = 2,5 (correto) aparece em execução, so que no banco grava 0,2 e quando acesso o registro novamente ja vem com o valor do banco 0,2

Informação tirada do manual do php sobre a função number_format:

Se apenas um parâmetro é dado, number será formatado sem decimais, mas com uma virgula (",") entre cada grupo de milhar.

Talvez seja o caso de você fazer a formatação arbitrária deste valor, ou tente alterar o campo no mysql para decimal e não float.

Force o campo a ser float.
Não use o number_format do sc.
Testa ai e me diz.

number_format retorna uma string e não um campo númerico.
Veja as notas: http://www.php.net/manual/pt_BR/function.number-format.php
Se há um caso parecido com o seu.
No manual do mysql há referências no caso de “conversão” de campos textos para float:
http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html
http://dev.mysql.com/doc/refman/5.1/en/problems-with-float.html
O seu sistema antigo trabalha na mesma versão do mysql e / ou php que o SC está trabalhando?
Houve mudanças entre as versões de php e mysql.

helderpirapora,
Deu certo oque queria fazer?

retomei o projeto, gente alguem tem uma solução para o problema? Até hoje não consegui resolver.

Da próxima vez pelo menos avise se deu certo ou se não poderá verificar as soluções postadas durante um período de tempo maior.
Seus colegas tiram tempo para responder as perguntas no Fórum e acho triste quando não dizem que o tempo dispendido no Fórum teve resultado.
Como sabem as vezes paramos coisas importantes para ajudar.
Eu tenho me ausentado do Fórum por situações como esta.

Eu estava de ferias… Mas pode ter certeza que avisarei sim, desculpe a minha falta de comunicação.