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: 8028
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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