Ir para conteúdo

POWERED BY:

Arquivado

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

ScornInPC

[Resolvido] Problemas com float type

Recommended Posts

Pessoal, olha que loucura. Tenho uma tabela com um campo float. Se eu uso o SUM para ver o valor total, sai 2535,58. Porem se eu discrimino item à item, a soma da 2535,59. Isso causa um erro no SAP e não deixa lançar o que eu preciso lançar. Alguma sugestão quanto à isso?

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

O MySQL mesmo.

 

O problema é alguma coisa de truncar, pois segue as duas queries usadas:

 

SELECT SUM(valor_total) FROM reembolsos WHERE id_reembolso = 21

 

SELECT FORMAT(valor_total, 2) FROM reembolsos WHERE id_reembolso = 21

OU AINDA

SELECT SUM(FORMAT(valor_total, 2)) FROM reembolsos WHERE id_reembolso = 21

 

Se somo a segunda ou utilizo a 3°, da 1 centavo de diferença. Citei o SAP B1, para deixar claro que essa diferença de 1 centavo é que está dando problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Das duas maneiras existem arredondamentos, porem, ele não poderia gravar 19.398273, se eu digitei 19.40, entendeu +/- o problema, acho que isso ocorre na origem, e não na soma, talvez não tenha dito isso pra deixar claro o que eu acho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não é no SAP, é no arredondamento mesmo.

 

por exemplo:

 

0.4446

345.122

2.28046

10.3659

582.326

582.326

10.3659

10.8153

50.3872

50.3666

50.3872

11.0431

43.3327

50.3872

50.3872

0.44408

327.748

327.748

2.25498

0.44408

26.607

 

Somem isso

 

usando o SUM = 2535.5834556818, que vira 2535.58

Porem o valor deveria ser 2535.59

Compartilhar este post


Link para o post
Compartilhar em outros sites

CONTA/PN		DEBITO	CREDITO	VENCIMENTO	PROJETO	DIRETORIA	FILIAL	GERENCIA/NATUREZA	ATIVIDADE/SETOR
5.1.06.01.003	1296,43	0		11/03/09		80002	1			F1		N13					A02
5.1.06.01.003	582,33	0		11/03/09		80001	1			F1		N13					A02
4.1.11.01.008	328,64	0		11/03/09		80002	1			F1		N13					A02
4.1.11.01.008	328,19	0		11/03/09		80001	1			F1		N13					A02
F00001		0		2185,58	11/03/09					
1.1.05.01.004	0		350		11/03/09					
			2535,59	2535,58 (esta linha foi feito calculo feito na calculadora)

Bem, com aqueles dados que enviei anteriormente, eu uso alguns groups, dai saem esses valores, e a soma dos 2 dão direfença desse 1 centavo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao quais sao os valores no db mas os que passou fiz na calculadora e o resultado foi 2535.5835, exatamente isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é mario, é o que deveria sair, mas esta saindo 2535,59

 

Segue minha query, é só um group e um sum

SELECT

					d.AcctCode,

					p.id_sap,

					SUM(ad.valor_total) As 'valor_total',

					p.id_projeto,

					a.id_colaborador,

					a.id_tipo_atividade,

					d.unidade

				FROM

					atividades_despesas ad,

					despesas d,

					atividades a,

					fases_projetos fp,

					projetos p

				WHERE

					ad.id_reembolso In (21)

						And

					d.id_despesa = ad.id_despesa

						And

					a.id_atividade = ad.id_atividade

						And

					fp.id_fase_projeto = a.id_fase_projeto

						And

					p.id_projeto = fp.id_projeto

				GROUP BY

					ad.id_despesa, p.id_projeto

Mas bem, acho que isso não é uma coisa normal, então vou ter que procurar outros métodos, sei la,

 

 

agradeço a todos, valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

usando o SUM = 2535.5834556818, que vira 2535.58

Porem o valor deveria ser 2535.59

 

 

deveria pq?

Pois se voce mesmo disse que a soma da 2535.58, mas no meu script ta saindo 2535.59, eu é quem coloquei 1 centavo ali a mais?

 

o banco tah fazendo a conta certo, você q quer botar mais 1 centavo ai

Se fosse pra ler isso não deveria nem ter postado meu problema neh.

 

E só pra matar o assunto, me Esqueci de ter mostrado a parte que eu somo o um centavo pra causar problemas no forum

 

SELECT
	d.AcctCode,
	p.id_sap,
	SUM(ad.valor_total) + 0.01 As 'valor_total',
	p.id_projeto,
	a.id_colaborador,
	a.id_tipo_atividade,
	d.unidade
FROM
	atividades_despesas ad,
	despesas d,
	atividades a,
	fases_projetos fp,
	projetos p
WHERE
	ad.id_reembolso In (21)
		And
	d.id_despesa = ad.id_despesa
		And
	a.id_atividade = ad.id_atividade
		And
	fp.id_fase_projeto = a.id_fase_projeto
		And
	p.id_projeto = fp.id_projeto
GROUP BY
	ad.id_despesa, p.id_projeto

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas porque quer somar o centavo?

 

resolveu o problema com isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não Mario, só fiz esse query para resolver de modo simples e que eu ja sabia, para nõa prolongar mais o assunto. E é claro que não vou usar essa solução, pois 200 notas por dia, vão dar 2 reais por dia, o que vai dar 60 reias por mes. Claro que não posso fazer isso. Mas fica tranquilo, assim que descobrir o problema disso, eu posto o resultado. Desconfio que seja o campo, descobri que posso criar o campo float e setar o tamanho dos decimais float(2), vou testar isso e ver se isso para de criar dizimas ao gravar, talvez resolva.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,

 

No próprio manual do MySQL existe uma advertência em se utilizar os tipos de ponto flutuante Double e Float para valores monetários, estes podem apresentar erros de arredondamento, como este do nosso amigo.

 

Ao invés de utilizar os tipos de ponto flutuante, utilize o tipo de ponto fixo DECIMAL ou o seu alias NUMERIC.

 

Exemplo:

 

DECIMAL(10,2)

Para alterar o tipode dado de sua tabela, utilize o comando ALTER TABLE.

 

Happy MySQL'ing http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Wagner, enfim uma resposta e não uma critica uhaeuhaeu

 

E sua resposta foi a resposta. As notas que ja existem, vou ter que ajustar na mão, pois ao mudar o tipo, ele arredondou e deu o mesmo problema, mas os novos ja viram com 2 casas decimais e não acontecerá o erro novamente.

 

DECIMAL(10, 2) foi a resposta dos problemas, não conhecia.

 

Muito obrigado a todos pela atenção e solução xD

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.