Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   FLOAT definir lugares decimales (https://www.clubdelphi.com/foros/showthread.php?t=75298)

lmpadron 11-08-2011 13:58:21

FLOAT definir lugares decimales
 
Hola amigos

Hay alguna forma de definir cuantos numero decimales (o sea después de la ,) puedo usar en el Float.
O sea alguna forma de definir que mi variable de tipo Float solo use X cantidad lugares después de la coma

Gracias de Antemano

duilioisola 11-08-2011 14:28:40

Una variable Float tiene (en teoría) infinitos decimales.
Lo que puedes hacer es redondear el valor a la cantidad de decimales que quieras.

Por ejemplo, deberías mirar el Help para la función RoundTo
Cita:

function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;

RoundTo(1234567, 3) 1234000
RoundTo(1.234, -2) 1.23
RoundTo(1.235, -2) 1.24
RoundTo(1.245, -2) 1.24
Otra cosa es que quieras que el usuario pueda entrar solo una cantidad determinada de decimales.
En es ecaso deberías ver las máscaras.

lmpadron 11-08-2011 14:56:23

muchas gracias mi hermano eso era exactamente lo que estaba buscando.

lmpadron 11-08-2011 15:40:30

Un problemilla

Cuando uso el RoundTo() me dice
Código:

[C++ Error] Unit1.cpp(323): E2268 Call to undefined function 'RoundTo'.
inclui el <math.h> pero aun así me sigue dando el problema, alguna idea

ecfisa 11-08-2011 15:53:27

Hola impadron.

Código:

double pi= 3.141592654,r;
  ShowMessage(FloatToStr((int)(pi*100)/100.0));    // 2 decimales
  ShowMessage(FloatToStr((int)(pi*1000)/1000.0));  // 3 decimales
  ShowMessage(FloatToStr((int)(pi*10000)/10000.0));// 4 decimales
  r = (int)(pi*100000)/100000.0;                  // 5 decimales
  //...

Saludos.

duilioisola 11-08-2011 16:00:32

Veo que estás programando en C. No se dónde estará esta función en C.

De todos modos, si quieres programarla tu, la cosa va más o menos así:
Código Delphi [-]
function RedondearDecimales(Valor : Double; Decimales: integer): Double;
begin
   // Primero multiplico el valor por 10 tantas veces como decimales quiera
   // Valor=1.12345, Decimales=2 --> Valor=112.345
   for i := 0 to Decimales do
      Valor := Valor * 10;

   // Ahora tomo la parte entera de Valor
   // 112.345 --> 112
   Valor := Trunc(Valor);

   // Ahora lo divido por 10 tantas veces como decimales tenga
   // Valor=1123, Decimales=2 --> Valor=1.12
   for i := 0 to Decimales do
      Valor := Valor * 10;
end

Nota: Esta función no tiene en cuenta el último decimal:
1.239 = 1.23
La función perfeccionada debería tenerlo en cuenta y devolver
1.239 = 1.24

lmpadron 11-08-2011 16:22:00

Gracias por sus ejemplos duilioisola y ecfisa en ambos casos puedo definir con cuantos decimales deseo trabajar ahora como decia duilioisola en ninguno de los casos puedo redondear. Saben alguna forma de hacer en c++ ??

ecfisa 11-08-2011 16:26:41

Hola impadrón.

Para obtener 'n' números decimales:
Código:

...
#include <math.h>
...
double NumNDec(double Num, int Dec)
{
 return ((float)(int)(Num*exp(log(10)*Dec))/exp(log(10)*Dec));
}

Uso:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
double pi= 3.141592654;
  for(int i=1; i< 5; i++)
    ListBox1->Items->Add(FloatToStr(NumNDec(pi,i)));
}

Saludos.

ecfisa 11-08-2011 16:54:32

Hola Impadrón.

No había visto tu último mensaje mientras ponía el anterior.

Para redondear:
Código:

...
#include <math.h>
...
double Round(double Num, int Dec)
{
  return ((float)((int)(Num*pow(10,Dec)+0.5)))/pow(10,Dec);
}

Uso:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
double pi= 3.141592654;
  for(int i=1;i< 5; i++)
    ListBox1->Items->Add(FloatToStr(Round(pi,i)));
}

Saludos.

Edito: En el ejemplo de número de dígitos me había olvidado de pow... :(, así que hice unos malabares... :)

Usando pow la función sería:
Código:

double NumNDec(double Num, int Dec)
{
 return ((float)(int)(Num*pow(10,Dec))/pow(10,Dec));
}


lmpadron 11-08-2011 17:25:02

muchas gracias

jcosta 12-08-2011 09:45:46

Yo utilizo la función FormatFloat. Sería algo así:

cadena = FormatFloat("0,.000", numero)

numero sería el valor decimal original y en cadena nos quedaria un string con separador de miles (,) , en este caso con tres decimales (número de ceros a la derecha del .). Si se quiere luego se puede volver a convertir de String a float con StrToFloat.

Un saludo

lmpadron 12-08-2011 15:12:45

voy a probarlo !!!


La franja horaria es GMT +2. Ahora son las 01:39:52.

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