Clipper/FiveWin - Error de redondeo

 
Vista:

Error de redondeo

Publicado por Mauricio (7 intervenciones) el 13/12/2007 22:10:44
Hola, tengo un programa echo en clipper 5.2, y en raras ocasiones se presenta un error en las cantidades por una o dos decimas. Revisando el programa vi que esta bien bueno al parecer el chico que lo hizo lo hace asi:

@ L,59 say ((pbruto-petara)-pdct)*precio/IIF(MONEDA='S',TIC,1) pict '@Z 999,999.99'
y lo acumula en
TO+=(((pbruto-petara)-pdct)*precio)/IIF(MONEDA='S',TIC,1)

La primero linea muestra bien los resultados, el problema esta en la variable TO, que es el acumulado deberia ser 390.81+151.94+315.15+435.86 = 1296.76, pero muestra 1296.75.

Le agrege el SET DECIMALS TO 2 Y EL SET FIXED ON, pero igual sigue acumulando mal, el problema esta en el ultimo nro 435.86, siempre lo ponia como 435.855 y no lo redondeaba cuando le agrege los SET, recien calculo bien, pero en el acumulado no sigue poniendo 1296.75.

Que podria estar pasando, me estoy olvidando de algo, la verdad q este programa no es mio pero tengo q arreglar este error, que ocurre rara vez.

Les agradeceria cualquier ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error de redondeo

Publicado por Adalberto Baqueros (213 intervenciones) el 13/12/2007 23:19:51
Mauricio

Lo que sucede es que la clausula PICT al mostrar los números, los redondea, entiendo que quieres solo la parte entera y no así en redondeo, utiliza entonces la funcion INT (en ambos casos).

@ L,59 say NIT( ((pbruto-petara)-pdct)*precio/IIF(MONEDA='S',TIC,1) ) pict '@Z 999,999.99'

TO += INT( (((pbruto-petara)-pdct)*precio)/IIF(MONEDA='S',TIC,1) )

FELIZ NAVIDAD!

Saludos, desde Santa Cruz de la Sierra - Bolivia
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error de redondeo

Publicado por El Duro (121 intervenciones) el 13/12/2007 23:24:41
Mauricio:

Utiliza la función ROUND(), y te recomiendo que el cálculo lo hagas solo una vez, mira este ejemplo:

nTotal := ROUND( ((pbruto-petara)-pdct)*precio/IIF(MONEDA='S',TIC,1) ,2)

@ L,59 say nTotal pict '@Z 999,999.99'

y lo acumula en
TO += nTotal

Observa el uso de la función ROUND() y observa tambien que te la he puesto dejando espacios al inicio y al final.

El Duro
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error de redondeo

Publicado por Mauricio (7 intervenciones) el 14/12/2007 14:39:26
Bueno gracias por sus respuestas, no quiero solo la parte entera asi que el INT no me sirve.
Duro, puse la funcion como dices pero nada me sigue botando 435.85 cuando deberia ser 435.86, la verdad q no se es raro xq cuando no le pongo el round() y le dejo el set fixed on y el set decimals to 2, si me lo redondea bien, pero en la variable que acumula no lo hace asi. Tambien lo puese como dijiste solo una vez el calculo y acumulo esa variable pero nada de nada siempre me muestra 1296.75 y deberia ser 1296.76 que es la suma de 390.81+151.94+318.15+435.86.

Ayuda porfa nose que puede ser.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error de redondeo

Publicado por El Duro (121 intervenciones) el 14/12/2007 16:41:15
Mauricio:

Entonces desmenuza las operaciones y utiliza ROUND(), seguramente en alguna operación se esta quedando ese centavo.

nImp := ROUND( (pbruto-petara)-pdct)*precio ,2)
nImp := ROUND( nImp/IIF(MONEDA="S",TIC,1) ,2)

o más desmenuzada si es neceario

El Duro
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error de redondeo

Publicado por Mauricio (7 intervenciones) el 14/12/2007 19:29:08
Duro, pucha al fin se arreglo pero nada con eso de los redondeos, xq le pongo round() y no lo redondea me pone 435.85 siempre, despues le puse el set fixed on y con el round() igual 435.85 pero le quito el round() y si 435.86, pero en los totales no lo considera, nose xq sera men la verdad no tengo ni idea.

Pero lo arregle asi:

temporal1 += val(str(Importe/Divisor))

lo convierto a cadena y despues uso el val por que lei que solo considera dos decimales, bueno asi alfin me sumo los 1296.76, si alguien me explica por que paso esto o nose como habra echo el pata que hizo el programa pero x nada de nada salia.

Bueno gracias, nos vemos saludos de Peru.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error de redondeo

Publicado por Pedro (38 intervenciones) el 18/12/2007 10:11:55
Mauricio

Tanto la función ROUND como el redondeo del sistema te tomará siempre el número superior si el tercer decimal es superior a 5, si es igual o inferior no llegará a redondear al inmediato superior

435,855 siempre será 435,85 en el redondeo a dos decimales
435,856 pasará a ser 435,86 en el redondeo a dos decimales

Espero que asi entiendas el motivo por el que no te toma el redondeo al alza que tu esperas.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error de redondeo

Publicado por Mauricio (7 intervenciones) el 18/12/2007 19:10:16
Ok, gracias pero no hay alguna forma de configurarlo para que tome el redondeo si es mayor o igual a 5.

De todas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar