Problemas com funcao matematica delphi 7

Delphi

02/04/2004

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.


Cleudsoncosta

Cleudsoncosta

Curtidas 0

Respostas

Marcio.theis

Marcio.theis

02/04/2004

tente fazer tvdup=Trunc(ttot/tp) para arredondar.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

02/04/2004

veja esse tópico

[url]http://delphiforum.icft.com.br/forum/viewtopic.php?t=36156[/url]


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

02/04/2004

Colega,

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

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

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

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

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;


GOSTEI 0
Rômulo Barros

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
POSTAR