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


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 27 Feb, 2013 12:25 pm Asunto: Problemas con redondeos |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mie 27 Feb, 2013 2:03 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 27 Feb, 2013 4:43 pm Asunto: |
|
|
| 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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mie 27 Feb, 2013 6:18 pm Asunto: |
|
|
| 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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 01 Mar, 2013 8:19 am Asunto: |
|
|
| 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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 01 Mar, 2013 8:40 am Asunto: |
|
|
| 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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
|