Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-10-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Question Función para redondear números reales

Les escribo para saber si alguien conoce alguna función para redondear
números reales que funcione de la siguiente manera:

$ 1,241 = $ 1,25
$ 1,239 = $ 1,25
$ 1,210 = $ 1,20

La idea es que indique valores reales de dinero.
He logrado algo parecido con la función RoundTo(Valor,-2),
pero no es lo mismo (No es válido cobrar $1,24 o $1,23).

Bueno, espero que se entienda.
Un saludo.
Responder Con Cita
  #2  
Antiguo 10-10-2005
Avatar de Sotrono
Sotrono Sotrono is offline
Miembro
 
Registrado: abr 2004
Ubicación: Buenos Aires - Argentina
Posts: 396
Poder: 21
Sotrono Va por buen camino
Podes utilizar la funcion Frac (que toma la parte decimal de un numero) y desarrollar una funcion vos.

Saludos..
Responder Con Cita
  #3  
Antiguo 10-10-2005
Avatar de Sotrono
Sotrono Sotrono is offline
Miembro
 
Registrado: abr 2004
Ubicación: Buenos Aires - Argentina
Posts: 396
Poder: 21
Sotrono Va por buen camino
Hola, la explicacion anterior fue bastante pobre...
Hice esta funcion que por los resultados que me dio parece funcionar:

Código Delphi [-]
function TForm1.RedondearPesos(var Numero: Real): Real;

function Redondear(Valor: Real; Redondeo: Integer):Real;
//Esta funcion (Redondear) fue sacada de Trucomania
begin
  Redondear := Round(Valor * Power(10, Redondeo)) / Power(10,Redondeo);
end;

var
  num: string;
  i: integer;
begin
  numero:= Redondear(numero, 2);
  if Frac(numero) > 0.95 then
    numero:= Redondear(numero,0);
  num:= FloatToStr(numero);
  for i:= Length(num) downto (Pos(',', num) + 2) do
    if (num[i] = '4') or (num[i] = '6') then
      num[i]:= '5'
    else if (num[i] = '1') or (num[i]= '2') then
      num[i]:= '0'
    else if (num[i] = '8') or (num[i] = '9') then
     begin
      numero:= Redondear(numero, 1);
      num:= FloatToStr(numero);
     end;
  Result:= StrToFloat(num);
end;
Le tendrias que hacer algunos retoques. No se que resultado queres cuando el numero es, por ejemplo 2,43 o 2,47.

Espero que te sirva..

Bytes...
Responder Con Cita
  #4  
Antiguo 10-10-2005
Torreblanca Torreblanca is offline
Miembro
 
Registrado: jul 2005
Ubicación: Veracruz México
Posts: 52
Poder: 19
Torreblanca Va por buen camino
Hola yo tambien estaba en esas hasta que encontre esta función

FloatToStrF()

la siguiente pagina explica su funcionamiento un poco mejor que en la ayuda de Delphi

http://www.delphibasics.co.uk/RTL.asp?Name=FloatToStrF

yo lo use de la sig manera:

FloatToStrF(sueldo,ffCurrency,8,2);

lo que hace es que con la variable "sueldo" que es Double la formateas como moneda, el 8 es la precision y el 2 son los decimales que deseas y te manda la variable con todo y signo de pesos. Ademas trae otros formatos como:
ffCurrency ffExponent ffFixed ffGeneral ffNumber

Espero te sirva.
Responder Con Cita
  #5  
Antiguo 10-10-2005
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Tambien esta la funcion FormatFloat..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #6  
Antiguo 10-10-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Podriamos inventar una función que, dado un valor, haga un redondeo al múltiplo mas cercano (por ejemplo del valor mínimo de la moneda de tu pais, que parece ser de 5 centimos).

así:

Código Delphi [-]
type
  TTipoRedondeo = (trMatematico, trAlMenor, trAlMayor);

function jachRedondeaMultiplos(valor, base : extended;
  TipoRedondeo : TTipoRedondeo = trMatematico; DigitosPrecision : Integer = 2) : extended;
var
  multiplicando : Int64;
  fraccion : Extended;
const
  precision_fraccion = 6;
begin
  multiplicando := round(valor / base);
  fraccion := roundTo(frac(valor / base), -precision_fraccion);
  case TipoRedondeo of
    trAlMayor : if (fraccion > 0) and
                   (fraccion < 0.5) then
                  multiplicando := multiplicando + 1;
    trAlMenor : if (fraccion >= 0.5) and
                   (fraccion < 1) then
                  multiplicando := multiplicando - 1;
  end;
  result := roundTo(multiplicando * base, -DigitosPrecision);
end;

Los parámetros son:

Valor: el valor que queres redondear,
base: la moneda de menor denominación de tu pais (o a la que te interese redondear)
TipoRedondeo: creo que no necesita explicación..
DigitosPrecision: Cuantos dígitos de precisión se usan en la moneda de tu pais. Si son céntimos, el valor será 2 (el que tiene por defecto).

Una llamada típica entonces podria ser:

Código Delphi [-]
  jachRedondeaMultiplos(Producto.costo * factorganancia, 0.05, trAlMayor);

Te aclarará también la siguiente tabla de resultados de llamadas a la función (asumiendo un redondeo a monedas de 0.05

Código:
|-----------|-----------|-----------|-----------|
|   valor   | matemático|  al menor |  al mayor |
|-----------|-----------|-----------|-----------|
|    1.41   |     1.40  |     1.40  |     1.45  |
|    1.45   |     1.45  |     1.45  |     1.45  |
|    7.23   |     7.25  |     7.20  |     7.25  |
|   14.32   |    14.30  |    14.30  |    14.35  |
|    8.69   |     8.70  |     8.65  |     8.70  |
|-----------|-----------|-----------|-----------|
Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 13-10-2005
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Poder: 19
Dexter182 Va por buen camino
Perdón por la demora

Cita:
Empezado por Sotrono
Hola, la explicacion anterior fue bastante pobre...
Hice esta funcion que por los resultados que me dio parece funcionar:

Código Delphi [-]
function TForm1.RedondearPesos(var Numero: Real): Real;
 
function Redondear(Valor: Real; Redondeo: Integer):Real;
//Esta funcion (Redondear) fue sacada de Trucomania
begin
Redondear := Round(Valor * Power(10, Redondeo)) / Power(10,Redondeo);
end;
 
var
num: string;
i: integer;
begin
numero:= Redondear(numero, 2);
if Frac(numero) > 0.95 then
numero:= Redondear(numero,0);
num:= FloatToStr(numero);
for i:= Length(num) downto (Pos(',', num) + 2) do
if (num[i] = '4') or (num[i] = '6') then
num[i]:= '5'
else if (num[i] = '1') or (num[i]= '2') then
num[i]:= '0'
else if (num[i] = '8') or (num[i] = '9') then
begin
numero:= Redondear(numero, 1);
num:= FloatToStr(numero);
end;
Result:= StrToFloat(num);
end;
Le tendrias que hacer algunos retoques. No se que resultado queres cuando el numero es, por ejemplo 2,43 o 2,47.

Espero que te sirva..

Bytes...
Hola, acá estoy de nuevo.
Uy, la cantidad de mensajes que me perdí.
Antes que nada, debo agradecer la función que me
pasó Sotrono.
La verdad me vino de maravillas.
Le hice algunas modificaciones.
La función Redondear la saqué y usé RoundTo, ya que hace lo mismo.
Y después le arreglé un pequeño error, que se producía cuando
el número a redondear no tenía decimales.
Lo solucioné preguntando si Pos(',', num) era distinto de cero.
Aparentemente ahora funciona 10 puntos.

Ahí va el código:

Código:
function TForm1.RedondearPesos(var Numero: Real): Real;
var
  num: string;
  i: integer;
begin
  numero:= RoundTo(numero, -2);
  num:= FloatToStr(numero);
  if (Pos(',', num)) <> 0 then
	for i:= Length(num) downto (Pos(',', num) + 2) do
	  if (num[i] = '3') or (num[i] = '4') or (num[i] = '6') then
		num[i]:= '5'
	  else if (num[i] = '1') or (num[i]= '2') then
		num[i]:= '0'
	  else if (num[i]='7') or (num[i] = '8') or (num[i] = '9') then
		begin
		  numero:= RoundTo(numero, -1);
		  num:= FloatToStr(numero);
		end;
  Result:= StrToFloat(num);
end;
Bueno, debo agradecer la ayuda de todos y bueno,
ahora voy a probar todas las otras posibilidades.
Igualmente, el problema ya está solucionado.
Pero nunca viene de más aprender un poco.
Agradezco de nuevo la ayuda de todos.
Un saludo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:04:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi