Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Toiel

[Resolvido] Soma de campos tipo text dá resultado errado

Recommended Posts

Olá Experts!

 

Tô quebrando a cabeça desde cedo com esse negócio, já fucei tudo o q pudia pra encontrar a solução mas não consegui.

 

Tá acontecendo o seguinte:

 

Eu tenho uma página pra inserir dados num banco MySql. Nesta página os campos do form são preenchidos por um while, em função do numero da página q a pessoa quer registrar (é um relatório eletrônico...)

 

Cada linha da tabela é um registro da "peça". Essa peça tem uma medida especificada, uma tolerancia superior e uma inferior. Depois essa peça tem um valor encontrado, nesse caso, o menor valor e o maior.

 

Sendo assim, eu quero fazer o calculo automatico do desvio. No desvio inferior, ele pega o valor especificado, subtrai a tolerancia inferior, e depois esse valor é subtraido do menor vaslor encontrado. Pro desvio superior é a mesma coisa só q ao contrario... (parece complicado, mas funciona...)

 

Consegui gerar tudo, inclusive o JS da soma dos campos, o q acontece é q o JS tá dando um resultado errado quando eu uso casas decimais (separadas por ponto). Por exemplo, se eu digito 2.33 no especificado, quando eu digito 0.1 na tolerancia inferior e 2.29 no menor valor encontrado, o resultado dá 0.06000000000000005.

 

Não consegui por nada do mundo tirar isso! Tentei colocar Number(), Parsefloat(), new Number(), e trocentas coisas q achei por aí..

 

O q pode estar acontecendo???

 

Obrigado desde já!

 

Segue meu codigo:

 

<?
include ("config_sistema.php");
$pagina = $_POST['nova_pagina_rai'];
$num_rai = $_POST['num_rai'];
$pag_calc = $pagina;

$consulta = mysql_query("SELECT * FROM registro WHERE num_rai = '$num_rai'");

$linhas = mysql_fetch_object($consulta);
$id_registro = $linhas->ID;

$id_prod_consulta = $linhas->codigo;
$consulta2 = mysql_query("SELECT * FROM produto WHERE ID = '$id_prod_consulta'");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
 <?
  
  switch($pag_calc){
  
	case "1":
  
		  $i = 1;
		break;

	case "2":
	
		$i = 31;
		break;
		
	case "3":
	
		$i = 61;
		break;
		
	case "4":
	
		$i = 91;
		break;
		
	case "5":
	
		$i = 121;
		break;
		
	}
  
	?>  
<script language="javascript" type="text/javascript">  
  <?
  while($i<=30*$pag_calc){
  ?>
function calcula_<? echo $i; ?>()
{
	 var espec_<? echo $i; ?> = new Number(document.getElementById("espec_item_<? echo $i; ?>").value); //campo encontrado
	 var tol_inf_<? echo $i; ?> = new Number(document.getElementById("tol_inf_item_<? echo $i; ?>").value); //campo tole inferior
	 var tol_sup_<? echo $i; ?> = new Number(document.getElementById("tol_sup_item_<? echo $i; ?>").value); //campo tole superior
	 var e_sup_<? echo $i; ?> = new Number(document.getElementById("e_sup_item_<? echo $i; ?>").value); //campo encontrado inferior
	 var e_inf_<? echo $i; ?> = new Number(document.getElementById("e_inf_item_<? echo $i; ?>").value); //campo encontrado superior
	 
	 var primeira_soma_<? echo $i; ?> = espec_<? echo $i; ?> - tol_inf_<? echo $i; ?>;
	 var segunda_soma_<? echo $i; ?> = espec_<? echo $i; ?> + parseFloat(tol_sup_<? echo $i; ?>);
	 
	 //campo que vai conter o resultado
	 document.getElementById("desvio_sup_item_<? echo $i; ?>").value = parseFloat(segunda_soma_<? echo $i; ?>) - e_sup_<? echo $i; ?>;
	 document.getElementById("desvio_inf_item_<? echo $i; ?>").value = e_inf_<? echo $i; ?> - primeira_soma_<? echo $i; ?>;
}
<? 
$i++;
}
?>
</script>
</head>

<body>
<? 
$linhas2 = mysql_fetch_object($consulta2);
?>
<table width="80%" border="0" cellspacing="0" cellpadding="0" align="center">
  <tr>
	<td width="4%" height="25"> </td>
	<td colspan="6">Produto: <? echo $linhas2->produto; ?></td>
	<td colspan="4">Código: <? echo $linhas2->codigo; ?></td>
  </tr>
  <tr>
	<td height="25"> </td>
	<td colspan="6">Fornecedor: <? echo $linhas->fornecedor; ?></td>
	<td colspan="4">Quantidade: <? echo $linhas->quantidade; ?></td>
  </tr>
  <tr>
	<td> </td>
	<td width="20%">Tipo: <? 
	if($linhas->tipo == "novo_produto"){
		echo "Novo Produto";
	} else {
		echo "Alteração de Produto";
	}
	?>
	</td>
	<td width="20%"> </td>
	<td width="3%"> </td>
	<td width="3%"> </td>
	<td width="3%"> </td>
	<td width="3%"> </td>
	<td width="17%"> </td>
	<td width="4%"> </td>
	<td width="4%"> </td>
	<td width="19%"> </td>
  </tr>
  <tr>
	<td> </td>
	<td> </td>
	<td> </td>
	<td width="3%"> </td>
	<td width="3%"> </td>
	<td width="3%"> </td>
	<td width="3%"> </td>
	<td> </td>
	<td> </td>
	<td> </td>
	<td> </td>
  </tr>
  <tr>
	<td> </td>
	<td>Status: <? 
	if($linhas->status == ""){
		echo "Status ainda não definido";
	} else {
		echo $linhas->status; 
	}
	?></td>
	<td> </td>
	<td colspan="5"> </td>
	<td> </td>
	<td> </td>
	<td> </td>
  </tr>
  <tr>
	<td> </td>
	<td> </td>
	<td> </td>
	<td width="3%"> </td>
	<td width="3%"> </td>
	<td width="3%"> </td>
	<td width="3%"> </td>
	<td> </td>
	<td> </td>
	<td> </td>
	<td> </td>
  </tr>
 
</table>
<table border="1" cellspacing="0" cellpadding="0" align="center">
<tr>
	<td width="7%" rowspan="2" align="center">Item</td>
	<td width="18%" height="18" rowspan="2" align="center">Especificado</td>
	<td width="18%" rowspan="2" align="center">Encontrado</td>
	<td colspan="4" align="center">caract. especiais </td>
	<td width="18%" rowspan="2" align="center">Desvio</td>
	<td width="5%" rowspan="2" align="center">A/C </td>
	<td width="5%" rowspan="2" align="center">Rej</td>
	<td width="23%" rowspan="2" align="center">Corrigir</td>
  </tr>
  <tr>
	<td width="3%" align="center">S</td>
	<td width="3%" align="center">C</td>
	<td width="3%" align="center">M</td>
	<td width="3%" align="center">m</td>
  </tr>
  <?
  
  switch($pagina){
  
	case "1":
  
		  $i = 1;
		break;

	case "2":
	
		$i = 31;
		break;
		
	case "3":
	
		$i = 61;
		break;
		
	case "4":
	
		$i = 91;
		break;
		
	case "5":
	
		$i = 121;
		break;
		
	}
  
  while($i<=30*$pagina){
  ?>
	<form name="inserir_dados_rai" action="grava_dados_rai.php" method="post" />
	<tr>
	<td align="center"><? echo $i; ?></td>
	<td height="18" align="center"><input type="text" size="10" id="espec_item_<? echo $i; ?>" name="espec_item_<? echo $i; ?>" onchange="java script:calcula_<? echo $i; ?>()"/><input type="text" size="3" id="tol_inf_item_<? echo $i; ?>" name="tol_inf_item_<? echo $i; ?>" onchange="java script:calcula_<? echo $i; ?>()"/><input type="text" size="3" id="tol_sup_item_<? echo $i; ?>" name="tol_sup_item_<? echo $i; ?>" onchange="java script:calcula_<? echo $i; ?>()"/></td>
	<td align="center"><input type="text" size="10" id="e_inf_item_<? echo $i; ?>" name="e_inf_item_<? echo $i; ?>" onchange="java script:calcula_<? echo $i; ?>()"/><input type="text" size="10" name="e_sup_item_<? echo $i; ?>" onchange="java script:calcula_<? echo $i; ?>()"/></td>
	<td align="center"><input type="radio" name="caract_especial_item_<? echo $i; ?>" value="seguranca"/></td>
	<td align="center"><input type="radio" name="caract_especial_item_<? echo $i; ?>" value="critica"/></td>
	<td align="center"><input type="radio" name="caract_especial_item_<? echo $i; ?>" value="maior"/></td>
	<td align="center"><input type="radio" name="caract_especial_item_<? echo $i; ?>" value="menor"/></td>
	<td align="center"><input type="text" id="desvio_inf_item_<? echo $i; ?>" name="desvio_inf_item_<? echo $i; ?>" size="10" onfocus="java script:calcula_<? echo $i; ?>()" />
	<input type="text" id="desvio_sup_item_<? echo $i; ?>" name="desvio_sup_item_<? echo $i; ?>" size="10" /></td>
	<td align="center"><input type="checkbox" name="ac_item_<? echo $i; ?>" value="ac" /></td>
	<td align="center"><input type="checkbox" name="rej_item_<? echo $i; ?>" value="rej" /></td>
	<td align="center"> </td>
  </tr>
  <?
  $i++;
  }
  ?>
</table>
<input type="hidden" name="pagina" value="<? echo $pagina; ?>" />
<input type="hidden" name="num_rai" value="<? echo $num_rai; ?>" />
<input type="hidden" name="id_registro" value="<? echo $id_registro; ?>" />
<input type="submit" value="Registrar" /> <input type="reset" value="Limpar Dados" />
</form>
</body>

</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fórum errado. Este fórum aqui é de PHP.

 

Movido: PHP=>Javascript

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi a dúvida pois o resultado é esse mesmo:

2.33 - 0.1 = 2.23

2.29 - 2.23 = 0.06

 

Não consegui por nada do mundo tirar isso! Tentei colocar Number(), Parsefloat(), new Number(), e trocentas coisas q achei por aí..

O que você gostaria de fazer realmente? Ter encontrado outro valor? Obter uma determinada quantidade de casas decimais? Sinceramente não entendi...

Compartilhar este post


Link para o post
Compartilhar em outros sites

klonder,

 

na verdade não está certo, pq 2.29 - 2.23 não é 0.06000000000000005...

 

ele coloca 0.06000000000000005, qndo na verdade é uma conta exata, e teria q dar somente 0.06...

 

E arredondar não funciona, porque eu não posso determinar quantas casas decimais o resultado terá, pq o usuário poderá utilizar diferentes quantidades de casas decimais em momentos diferentes...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teste o código abaixo em seu editor:

<html>
<head>
<title></title>
<script type="text/javascript">
//Script by Klonder

function calcular() {
//Capturando os valores dos campos texto;
var numEspecificado = document.getElementById("numEsp").value;
var numTolInferior = document.getElementById("numTolInf").value;
var numEncontrado = document.getElementById("numEncont").value;

//Verifica a quantidade máxima de casas decimais inseridas pelo usuário;
var maxDecimais = new Array();
maxDecimais[0] = (numEspecificado.length-numEspecificado.indexOf(".",0)-1);
maxDecimais[1] = (numTolInferior.length-numTolInferior.indexOf(".",0)-1);
maxDecimais[2] = (numEncontrado.length-numEncontrado.indexOf(".",0)-1);
//Ordenando o array para pegar o maior valor:
maxDecimais.sort();

var formula = numEncontrado-(numEspecificado-numTolInferior);
//Utilizando o toFixed para incluir a quantidade máxima de casas decimais de acordo
//com o que foi inserido pelo usuário:
document.getElementById("numResultado").value = formula.toFixed(maxDecimais[(maxDecimais.length-1)]);
}
</script>
</head>
<body>

Altere os valores abaixo para testar as diferentes situações:
<br><br>

<form name="form1" action="" method="post">
Valor especificado: <input name="numEsp" id="numEsp" value="2.33">
<br>Tolerância inferior: <input name="numTolInf" id="numTolInf" value="0.1">
<br>Menor valor encontrado: <input name="numEncont" id="numEncont" value="2.29">
<br><input type="button" onClick="calcular()" value=" Resultado "> -->
<input name="numResultado" id="numResultado">
</form>

</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Klonder,

 

Perfeito!

 

Adaptei no meu código aki e funcionou perfeito!

 

Eu tinha pensado nisso de pegar qtas casas decimais o usuario inseriu e mandar formatar com esta quantidade de casas.... mas você reinou...

 

Obrigado mesmo..

 

Só mais uma coisa, no Firefox o meu script não tá funcionando? Será por causa q eu colokei pra rodar a formula pelo onChange?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.