Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

double 8,04*100 = 803

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: double 8,04*100 = 803 Responder citando

Me estoy volviendo loco
Tengo un programa hecho con 2007, que no convierte bien los decimales
Código:
int fp;
double doble;

doble=8.04*100;
fp=doble;

Todos los cálculos internos (y DBs) los hago sin decimales, para, una vez tratados, dividir por 100 para mostrarlos o imprimirlos.

Pero en este caso no funciona y fp da un resultado de 803. doble da un resultado de 804, como debe ser

¿alguien sabe porque motivo? o ¿alguna forma de hacerlo correcto?
He probado con el System::Int(doble*100) pero sigue dando 803

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

He encontrado una solución temporal (o definitiva) que funciona, aunque no es lo correcto
Código:
int fp;
double doble;
char temp[25];

doble=8.04;
sprintf(temp,"%f",doble*100);
fp=atol(temp);


fp es ahora 804. El atol lo uso para estos casos por si temp tiene algún valor 'raro'

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

también se puede hacer lo siguiente:

Código:
#include <math>

int DoubleToInt(const double &dbl)
{
  double db;
  if(dbl <0>= 0.5f)
       db--;
  }
  else   {
    if(modf(dbl,&db) >= 0.5f)
       db++;
  }
  return (int) db;
}

//----------------

void __fastcall TForm1::Button7Click(TObject *Sender)
{
int fp;
double doble;

doble=8.04*100;
fp=DoubleToInt(doble);
}


o

Código:

void FloatToInt(int *int_pointer, float f)
{
   __asm  fld f
   __asm  mov edx, int_pointer
   __asm  FRNDINT
   __asm  fistp dword ptr [edx];
}

//------------

void __fastcall TForm1::Button6Click(TObject *Sender)
{

int fp;
double doble;

doble=8.04*100;
FloatToInt(&fp, doble);
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias por tus soluciones, las pruebo y te digo
En cuanto a la primera, yo trabajo siempre con enteros y los convierto a decimal cuando los ve el user. En este caso es una introducción de precio e inmediatamente lo paso a entero. En casi 15 años nunca había fallado la forma int=double*100. simplemente coger la parte entera


Gracias

EDITO: perfecto el asm. Con eso me quedo. Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.