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 

Problemas con redondeos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problemas con redondeos Responder citando

En una base de datos Firebird necesito guardar sólo dos decimales de unos importes. Estoy usando este código:
Código:
nImporte = qRecibos->FieldByName("Cuota")->AsFloat;
switch (qRecibos->FieldByName("Periodo")->AsInteger)
{
     case 1:
          nImporte = (3 - (StrToInt(dFecha.FormatString("m")) - 1) % 3) * nImporte / 3;
          break;
     case 2:
          nImporte = (6 - (StrToInt(dFecha.FormatString("m")) - 1) % 3) * nImporte / 6;
          break;
     case 3:
          nImporte = (13 - StrToInt(dFecha.FormatString("m"))) * nImporte / 12;
          break;
}
nImporte = floor(100 * nImporte + 0.5) / 100;

donde nImporte es un double. Si por ejemplo el valor de entrada es 10 y hay que aplicar la proporcinalidad para 12 meses (case 3) el resultado es 9,1666666666666666666666666666667, que al redondear se queda en 9,17; sin embargo al guardar el valor en la tabla, en una columna definida como float, me aparece 9,17000007629395 y no sé como hacer para que guarde sólo ese 9,17. ¿Alguna idea?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

lo que hago siempre es cargar el (double*100)+0.5 a un entero y después hacer la división por cien del entero al double: int=(double) double/100;


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

bosoft escribió:
lo que hago siempre es cargar el (double*100)+0.5 a un entero y después hacer la división por cien del entero al double: int=(double) double/100;

Lo había pensado pero no sé porqué lo descarté; el caso es que al probarlo tal cual has sugerido, e ignoro el motivo, directamente me truncaba los decimales. Incompresible.

Al final he optado por definir el campo como decimal de dos posiciones.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Angel escribió:
bosoft escribió:
lo que hago siempre es cargar el (double*100)+0.5 a un entero y después hacer la división por cien del entero al double: int=(double) double/100;

Lo había pensado pero no sé porqué lo descarté; el caso es que al probarlo tal cual has sugerido, e ignoro el motivo, directamente me truncaba los decimales. Incompresible.

Al final he optado por definir el campo como decimal de dos posiciones.

es lo normal, en un entero no caben decimales y directamente los trunca. Ese es el motivo por el cual siempre he echo eso, y hablo desde el MSDOS

Saludos.

PD: cuantas facturas de multinacionales no tiene el iva y la base mal sumada por no hacer eso. es la forma mas segura
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

bosoft escribió:
es lo normal, en un entero no caben decimales y directamente los trunca. Ese es el motivo por el cual siempre he echo eso, y hablo desde el MSDOS

Es que yo lo hago al revés:
1. Paso el float a entero
Código:
int = 100 * double

2. Grabo el entero dividido por 100 en el float de la tabla:
Código:
float = int / 100

Pero al hacer esto me trunca los decimales.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Angel escribió:

Es que yo lo hago al revés:
1. Paso el float a entero
Código:
int = 100 * double

2. Grabo el entero dividido por 100 en el float de la tabla:
Código:
float = int / 100

Pero al hacer esto me trunca los decimales.

Aquí es donde está el fallo
cambia esto
Código:
float = int / 100

por esto
Código:
float = (float) int / 100

el problema es que int/100 da como resultado un int y después lo asigna al float. Pero si le dices que quieres el resultado en float la cosa cambia

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

De acuerdo. Gracias.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
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.