Problemas com funcao matematica delphi 7
Ola colegas estou com um problema que nao conssigo resolver que talvez seja mui simples mas....
estou fazendo um programa que deve gerar um calculo de parcelas ex:
200.00 dividido em tres pacelas deveria ficar assim uma parcela de 68, e as outras de 66 sem gerar centavos no clipper ele faz direitinho mais no delphi a funcao que fiz no delphi foi a seguinte:
procedure TForm1.Button1Click(Sender: TObject);
var Tp,t,x:integer;
Ttot, Tresto, Tvdup:Real;
begin
Ttot:=200;
Tp:=3;
for x:=1 to Tp do
begin
Tvdup:=(Ttot/Tp);
Tvdup:=Round(Tvdup);
Tresto:=Ttot-(Tvdup*Tp); //nunca le esta linha qundo depuro
if x=1 then
Tvdup:=Tvdup+Tresto;
end;
end;
e nao arredonda nada ja tentei com int(tot/tp) retorna 0
se colocar tvdup=round(ttot/tp) retorna 0 e do jeito que esta nao arredonda fica 66,666666
Tem alguma solucao para este caso?
Grato antecipadamente, léo.
estou fazendo um programa que deve gerar um calculo de parcelas ex:
200.00 dividido em tres pacelas deveria ficar assim uma parcela de 68, e as outras de 66 sem gerar centavos no clipper ele faz direitinho mais no delphi a funcao que fiz no delphi foi a seguinte:
procedure TForm1.Button1Click(Sender: TObject);
var Tp,t,x:integer;
Ttot, Tresto, Tvdup:Real;
begin
Ttot:=200;
Tp:=3;
for x:=1 to Tp do
begin
Tvdup:=(Ttot/Tp);
Tvdup:=Round(Tvdup);
Tresto:=Ttot-(Tvdup*Tp); //nunca le esta linha qundo depuro
if x=1 then
Tvdup:=Tvdup+Tresto;
end;
end;
e nao arredonda nada ja tentei com int(tot/tp) retorna 0
se colocar tvdup=round(ttot/tp) retorna 0 e do jeito que esta nao arredonda fica 66,666666
Tem alguma solucao para este caso?
Grato antecipadamente, léo.
Cleudsoncosta
Curtidas 0
Respostas
Marcio.theis
02/04/2004
tente fazer tvdup=Trunc(ttot/tp) para arredondar.
GOSTEI 0
Emerson Nascimento
02/04/2004
veja esse tópico
[url]http://delphiforum.icft.com.br/forum/viewtopic.php?t=36156[/url]
[url]http://delphiforum.icft.com.br/forum/viewtopic.php?t=36156[/url]
GOSTEI 0
Aroldo Zanela
02/04/2004
Colega,
Mais uma sugestão, baseado no seu tópico:
Mais uma sugestão, baseado no seu tópico:
var ValorTotal: Currency; ValorParcelas, PrimeiraParcela: Integer; nParcelas: Integer; begin ValorTotal := 200; nParcelas := 3; ValorParcelas := Trunc(ValorTotal/nParcelas); PrimeiraParcela := ValorParcelas + Trunc(ValorTotal - (ValorParcelas * nParcelas));
GOSTEI 0
Marco Salles
02/04/2004
Ola colegas estou com um problema que nao conssigo resolver que talvez seja mui simples mas....
[b:f985449ce3]Tresto:=Ttot-(Tvdup*Tp); [/b:f985449ce3]//[b:f985449ce3]nunca le esta linha qundo depuro[/b:f985449ce3]
Com Certeza o Mais Interresante em Seu Tópico Seja Este Detalhe..Um Detalhe Quase Que Imperceptível, Mas Que Voce Fez Questão De Mencionar... Se Voce Ñotar, [b:f985449ce3]Esta não é a Única Linha [/b:f985449ce3]Que o Compilador Não Lê Quando Voce Depura o Programa.... A Instrução:
[b:f985449ce3]Tvdup:=Tvdup+Tresto; Também Não Lê [/b:f985449ce3] .....Na Realidade Estas [b:f985449ce3]Duas Instruções Não Chegam Nem a Ser Compiladas e Portando Não Serão Executadas,[/b:f985449ce3] Isto Dificultou a Voce Fazer Uma Análise Do Código Que Voce Gerou, Para Ver Onde Voce Esta Errando... Bem Que Voce Tentou Depurar So Que Nada Adiantou :!: :idea: :idea: A Saída Para Isto é Simples: Declare as Variáveis Ttot, Tresto, Tvdup:Real; Abaixo Da Secção implementation Do Form , Ou Force a Utilização Destas Variáveis Usando Por Exemplo a Função ShowMessage(FloatToStr(Tresto)); Para Concluir.. note a Analogia do Código Simples Abaixo, Com o Código Que Voce Gerou...
procedure TForm1.Button4Click(Sender: TObject); var x:Integer; begin x:=1; //Não Compila e Tambem Não Lé...E Isto Que Esta Acontecendo end; //Com Voce,Alem Dos Erros Que Voce Mesmo Pode Descobrir[
Ultima Dica: A Função Round Arredonda Para Cima Ou Para Baixo e a Funçaõ Trunc Simplesmente Arredonda... No Seu Caso é Melhor Usar a Função Trunc...Simplesmente Arredonda
Espero Que Voce Tenha Entendido a Mensagem e Com as Dicas Dos Companheiros aí Acima Tenha Condições Por Si So De Fazer A Sua Própia Rotina
GOSTEI 0
Aroldo Zanela
02/04/2004
Outra forma (Com classe):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TParcelamento = Class
ValorTotal: Currency;
PrimeiraParcela: Currency;
ValorParcelas: Currency;
QtdeParcelas: Integer;
procedure Clear;
procedure Execute;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var Parcelas: TParcelamento;
begin
Parcelas := TParcelamento.Create;
Parcelas.Clear;
Parcelas.ValorTotal := 200.00;
Parcelas.QtdeParcelas := 3;
Parcelas.Execute;
ShowMessage(´Primeira: ´ +FloatToStrF(Parcelas.PrimeiraParcela, ffNumber, 15, 2)+#13+
´Demais (´+ IntToStr(Parcelas.QtdeParcelas-1)+´): ´ +FloatToStrF(Parcelas.ValorParcelas, ffNumber, 15, 2));
Parcelas.ValorTotal := 300.00;
Parcelas.Execute;
ShowMessage(´Primeira: ´ +FloatToStrF(Parcelas.PrimeiraParcela, ffNumber, 15, 2)+13+
´Demais (´+ IntToStr(Parcelas.QtdeParcelas-1)+´): ´ +FloatToStrF(Parcelas.ValorParcelas, ffNumber, 15, 2));
Parcelas.ValorTotal := 445.00;
Parcelas.Execute;
ShowMessage(´Primeira: ´ +FloatToStrF(Parcelas.PrimeiraParcela, ffNumber, 15, 2)+13+
´Demais (´+ IntToStr(Parcelas.QtdeParcelas-1)+´): ´ +FloatToStrF(Parcelas.ValorParcelas, ffNumber, 15, 2));
Parcelas.Free;
end;
{ TParcelamento
ValorTotal: Currency;
PrimeiraParcela: Currency;
ValorParcelas:
QtdeParcelas: Integer;}
procedure TParcelamento.Clear;
begin
ValorTotal := 0;
PrimeiraParcela := 0;
ValorParcelas := 0;
QtdeParcelas := 0;
end;
procedure TParcelamento.Execute;
begin
ValorParcelas := Trunc(ValorTotal/QtdeParcelas);
PrimeiraParcela := ValorParcelas + Trunc(ValorTotal - (ValorParcelas * QtdeParcelas));
end;
end.GOSTEI 0
Marco Salles
02/04/2004
Ultima Dica: A Função Round Arredonda Para Cima Ou Para Baixo e a Funçaõ Trunc Simplesmente Arredonda... No Seu Caso é Melhor Usar a Função Trunc...Simplesmente Arredonda
Eu Foi Gentilmente Corrigido Pelo Aroldo, e Quero Em Publico Corrigir a Citação Anterior. De Fato Eu Me Expressei Mal. Estava Influenciado Pela Função Round Que ´Arredonda´ e Usei o Mesmo ´Termo´ Para a Função Trunc.. De Fato, o Que Deveria Ter Citado Corrigido Seria:
Ultima Dica: A Função Round Arredonda Para Cima Ou Para Baixo e a Funçaõ Trunc[b:a9149e08ae] Retorna [/b:a9149e08ae]a Parte Inteira De Um Número... No Seu Caso é Melhor Usar a Função Trunc...
GOSTEI 0
Germando
02/04/2004
Utilize o seguinte codigo:
Var
valor,parcela,total : real;
codigo : integer;
retorno : string;
begin
val(edit1.text,valor,codigo); //valor total
val(edit2.text,parcela,codigo); // quant de parcelas
Total := valor / parcela;
Str(total:8:0,retorno); // 8:0 sem casas decimais, arredonda 8:1 1
edit3.text := retorno;
end;
Var
valor,parcela,total : real;
codigo : integer;
retorno : string;
begin
val(edit1.text,valor,codigo); //valor total
val(edit2.text,parcela,codigo); // quant de parcelas
Total := valor / parcela;
Str(total:8:0,retorno); // 8:0 sem casas decimais, arredonda 8:1 1
edit3.text := retorno;
end;
GOSTEI 0
Rômulo Barros
02/04/2004
Peco a voces o seguinte: Quando colocarem codigos com + de 3 variaveis, comentem as mesmas, descrevendo o que cada uma representa, facilitando assim o entendimento em geral, a final de contas, programadores que naum comentam suas linhas de codigos sao pessimos profissionais. :oops:
GOSTEI 0