TRUNCAR VALORES E NAO ARREDONDAR

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

TRUNCAR VALORES E NAO ARREDONDAR

Mensagem por rubens »

Ola pessoal...

Achei que este problema nao fosse acontecer comigo, mas estou quebrando a cabeca...

Preciso trunca o valor e nao arredondar.. .como eu faco... ???

Por exemplo em um calculo me retorna 1,6752
Ai o clipper arredonda para 1,80 e bagunça a porcentagem que gerou este valor..

Preciso revolver isso sem mexer nas casas decimais...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Everton
Usuário Nível 3
Usuário Nível 3
Mensagens: 143
Registrado em: 07 Jul 2004 08:53
Localização: Campo Grande - MS

Mensagem por Everton »

Olá Rubens.

Uma forma simples de resolver isso que a variavel que recebe o valor do resultado tenha o função transform(), contendo na mascara 3 casas decimais e ao apresentar na tela ou impresso vc somente apresente 2 casas decimais. qualquer coisa estamos ai.
Everton Luiz Penteado
Clipper 5.2b - Blink 7.0
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Seu arredondamento aparenta estar errado. 1,6752 p/ 1,80?

A função round(n1, n2) faz o arredondamento que vc quer.

n1 - número à ser arredondado.
n2 - número de casas decimais para arredondamento.

SET DECIMALS TO 2
SET FIXED ON
//
? ROUND(10.4, 0) // Result: 10.00
? ROUND(10.5, 0) // Result: 11.00
? ROUND(10.51, 0) // Result: 11.00
? ROUND(10.49999999999999, 2) // Result: 10.50

? ROUND(101.99, -1) // Result: 100.00
? ROUND(109.99, -1) // Result: 110.00
? ROUND(109.99, -2) // Result: 100.00
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Rubens, se você quer truncar o valor em duas casas decimais mas sem fazer o arredondamento, basta fazer o seguinte calculo:

calculo=1.6752
calculo2=int(calculo*100)/100

O valor da variável calculo2 será de 1,67.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
diogenes_varela
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 04 Nov 2006 19:33
Localização: Brasília - DF

Mensagem por diogenes_varela »

Simplifique assim:

calculo = 1.6752

calculo2 = PADR(calculo,4)

O valor de calculo2 também será 1.67

Se for usar a variável para outros cálculos, basta acrescentar VAL que o valor continuará sendo tipo numérico:

calculo2 = VAL(PADR(calculo,4))
Os computadores não sabem o que fazem. Nós, na maioria das vezes, também não...

E disse ao Programador: "Todos os teus programas terão erros e irás corrigi-los até ao fim dos teus dias". Gen. 1:9
Humberto
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 26 Mai 2021 11:38
Localização: Goiânia/GO

TRUNCAR VALORES E NAO ARREDONDAR

Mensagem por Humberto »

Para mim isso funciona muito bem.
Talvez ainda pode ser útil para alguém.


/********************
PROGRAMA : TRUNCA.PRG
OBJETIVO : Trunca um número decimal.
DATA : 18/09/2004

NOTA: Compilar com as opções /L /M

Sintaxe:

trunca(nNumero, [nDecimais]) -> nNumeroTruncado

Argumentos:

nNumero -> É o número a ser truncado.

[nDecimais] -> Indica a quantidade de casas decimais que se deseja consi-
derar. 0 indica nómero inteiro.
Ex.: trunca(1,23456789, x)
x=0 = número inteiro -> 1
x=1 = uma casa decimal -> 1,2
x=2 = duas casas decimais -> 1,23

Retorno:

trunca() retorna um número com o resultado da operação.

*/

*******************************************************************************
parameters nNumero, nDecimais

// Consiste os parametros.
nNumero := if(valtype(nNumero) # "N", 0, nNumero)
nDecimais := if(valtype(nDecimais) # "N", 0, abs(nDecimais))

// Transforma o número numa cadeia de caracteres, trunca e converte para número
nNumero := str(nNumero * (10^nDecimais))
nNumero := val(left(nNumero, at(".", nNumero))) / (10^nDecimais)

return (nNumero)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

TRUNCAR VALORES E NAO ARREDONDAR

Mensagem por Itamar M. Lins Jr. »

Olá!
Depois de usar calculo2=int(calculo*100)/100

No final troquei para ROUND(nValor,2)

Por conta do arredondamento que o comerciante faz questão.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

TRUNCAR VALORES E NAO ARREDONDAR

Mensagem por JoséQuintas »

E pra quem pretende usar MySQL, pode chamar de Floor().
Gostei do detalhe de 10 ^ n, não tinha pensado nisso.

A propósito....
Percebi no MySQL o problema de ponto flutuante.
Mas lá, o Round() resolve.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder