| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Dom 25 Oct, 2015 10:36 am Asunto: double 8,04*100 = 803 |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Dom 25 Oct, 2015 11:00 am Asunto: |
|
|
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 |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Dom 25 Oct, 2015 3:38 pm Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Dom 25 Oct, 2015 7:08 pm Asunto: |
|
|
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 |
|
 |
|