error en comprobatoria de suma

error en comprobatoria de suma

Postby postinelli » Wed Apr 29, 2015 2:15 pm

hola gente

tengo un error que me tiene desconcertado

realizo una comprobación muy basica de una suma de unos items

casi siempre me dá bien, pero con una combinacion no hay caso, NO me da

SET DECIMALS TO 2

a:=770.45
b:=452.98
c:=1.18

t:=1224.61

if t<>a+b+c
alert('error en sumatoria')
endif

alert('t:' + str(t,9,2)) //// 1224.61
alert(a+b+c+:' + str(a+b+c,9,2)) //// 1224.61

cuando comparo es el error

con muchas, pero muchas combinaciones esta comprobacion me da OK, pero con estos numeros no hay caso

imagino que será un problema con la cantidad de decimales que trabaja internamente, pero no se como controlarlo, si es que hay forma de hacerlo

alguna idea?
postinelli
 
Posts: 147
Joined: Tue Jul 15, 2008 7:12 pm
Location: Argentina

Re: error en comprobatoria de suma

Postby ACC69 » Wed Apr 29, 2015 2:31 pm

postinelli wrote:hola gente

tengo un error que me tiene desconcertado

realizo una comprobación muy basica de una suma de unos items

casi siempre me dá bien, pero con una combinacion no hay caso, NO me da

SET DECIMALS TO 2

a:=770.45
b:=452.98
c:=1.18

t:=1224.61

if t<>a+b+c
alert('error en sumatoria')
endif

alert('t:' + str(t,9,2)) //// 1224.61
alert(a+b+c+:' + str(a+b+c,9,2)) //// 1224.61

cuando comparo es el error

con muchas, pero muchas combinaciones esta comprobacion me da OK, pero con estos numeros no hay caso

imagino que será un problema con la cantidad de decimales que trabaja internamente, pero no se como controlarlo, si es que hay forma de hacerlo

alguna idea?



Hola buenos dias Ing, Postinelli,esperando que se encuentre bien , le envio cordial saludos.

Tienes que usar la funcion ROUND(), para que te de exacto, no necesario usar el comando set decimals to 2

Te recomiendo que uses esta instruccion a mi me funciona sin problemas..

IF ( ROUND(aSum[3],2) <> 0.00 )
.....
ENDIF


Aprovechando tu post en el foro, sera que me puedas enviar de nuevo el entorno de programacion en xHarbour de xEdit 3.20, aun no lo he hecho funcionar, y me marca un sin fin de errores en general le puse +FiveHX,pero no se que mas librerias incluir en el entorno, ya cheque en el foro,aun asi no logro funcionar ,en harbour no hay problema, me funciona de maravilla.

Saludos y gracias

Atte: Adrian C. C.
acc69@hotmail.com
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: error en comprobatoria de suma

Postby karinha » Wed Apr 29, 2015 2:40 pm

Code: Select all  Expand view

#include "FiveWin.ch"

static oWnd

#xtranslate round(<nVal>,<nDec>) => val(str(<nVal>,20,<nDec>))

FUNCTION Main()

   local oBar

   DEFINE WINDOW oWnd TITLE "TestE Round()"

   DEFINE BUTTONBAR oBar _3D OF oWnd

   DEFINE BUTTON OF oBar ACTION Test_Round()

   SET MESSAGE OF oWnd TO "TestE Round()" NOINSET CLOCK DATE KEYBOARD

   ACTIVATE WINDOW oWnd

RETURN NIL

FUNCTION Test_Round()

   LOCAL nImp, qt, preco, nNewImp, nNewValor

   nNewValor := 0
   nImp      := 0.00
   qt        := 2.0500
   preco     := 14.7000

   //nImp := Round(  (qt * preco) , 2 )

   nImp := ( ROUND( qt, 2 ) ) * ( ROUND( preco, 2 ) )

   ? ROUND( nImp, 2 )

   ? Str(Round(nImp,2),12,6)  // veja como apresenta aqui

   nImp := Round(Val(StrZero(preco*qt,12,2)),4)

   ? ROUND( nImp, 2)  // Deveria retornar 30.14 e nao esta... Retorna 30.13

   nNewImp := PADR( nImp, 6 )

   nImp := VAL( PADR( nNewImp, 6 ) )

   nNewValor := ROUND( nImp, 2 )

   ? nNewValor  // assim retorna correto, 30.14

RETURN NIL

FUNCTION ROUND2(VVALOR,VDEC)

VVALOR=VAL(STR(VVALOR,19,6))

RETURN(VAL(STR(VVALOR,19,VDEC)))

 SET DECIMALS TO 2

   Msginfo( "Valor inicial : "+Str( 8.00, 5,2 ) + CRLF + ;
            "Base Imponible: "+Str( Round( 8/1.21 , 2 ) , 5 , 2 ) + CRLF + ;
            "IVA           : "+Str( Round(Round( 8/1.21 , 2 ) * 0.21,2) , 5 , 2 ) + CRLF + ;
            "Total         : "+Str( Round( 8/1.21 , 2 )+Round(Round( 8/1.21 , 2 ) * 0.21,2) , 5 , 2 ) ;
          )


Hola Eloy:
A ver si con esta sale: La funcion xRound(), la pongo al final de estas lineas.

MsgInfo(xround( xROUND(7/1.21,3),2 ) )
MsgInfo(xRound( xROUND(7/1.21,3),2 ))
MsgInfo(xRound( xROUND(7/1.21,3),2 ) - 7 )

MsgInfo(xround( xROUND(8/1.21,3),2 ) )
MsgInfo(xRound( xROUND(8/1.21,3),2 ))
MsgInfo(xRound( xROUND(8/1.21,3),2 ) - 8 )

Aparentemente salen ok.

Function xRound( x, y )
Local nDeci := 2

y := 2

nDeci := Set( _SET_DECIMALS, y )
If x >= 0
x := Val( Str( Int( x * 10 ** y + 0.5000001 ) ) ) / 10 ** y
Else
x := Val( Str( Int( x * 10 ** y - 0.5000001 ) ) ) / 10 ** y
Endif
Set( _SET_DECIMALS, nDeci )

Return x


Saludos y espero que funcione.

http://forums.fivetechsupport.com/viewtopic.php?f=6&t=27887&hilit=ROUND


Eloy: La funcion que pongo funciona bien. Fíjate que hago 2 redondeos.

xRound( xRound())
el xRound() de adentro a 3 decimales y el de afuera a 2 decimales.
Primero a 3 decimales y luego a dos, me funciona bien aquí.

MsgInfo(xround( xROUND(7/1.21,3),2 ) )
MsgInfo(xRound( xROUND(7/1.21,3),2 ))
MsgInfo(xRound( xROUND(7/1.21,3),2 ) - 7 )

MsgInfo(xround( xROUND(8/1.21,3),2 ) )
MsgInfo(xRound( xROUND(8/1.21,3),2 ))
MsgInfo(xRound( xROUND(8/1.21,3),2 ) - 8

Saludos

Simplifique assim:

calculo = 1.6752

calculo2 = PADR(calculo,4)

O valor de calculo2 também será 1.67

Se for usar a variável para outros cálculos, basta acrescentar VAL que o valor continuará sendo tipo numérico:

calculo2 = VAL(PADR(calculo,4))

// round normal to 2 decimal places
? ft_Round( nDollars )
// round normal to 6 decimal places
? ft_Round( nIntRate, 6 )
// round to nearest thousands
? ft_Round( nPrice, 3, NEAREST_WHOLE_NUMBER )
// round Up to nearest third
? ft_Round( nAmount, 3, NEAREST_FRACTION, ROUND_UP )
// round down to 3 decimals Within .005
? ft_Round( nAvg, 3, , ROUND_DOWN, .005 )

Ver: CEILLING() do xharbour
 


João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7316
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: error en comprobatoria de suma

Postby postinelli » Wed Apr 29, 2015 2:57 pm

gracias

por ahora Round() fue la solucion facil, ojala sea la definitiva
se ve que la suma trabaja con muchos decimales

Adrian, te mandé email por privado para no molestar en el foro

Pablo
postinelli
 
Posts: 147
Joined: Tue Jul 15, 2008 7:12 pm
Location: Argentina

Re: error en comprobatoria de suma

Postby FranciscoA » Wed Apr 29, 2015 3:35 pm

Hola, si en un futuro te da el mismo problema aunque uses Round(), prueba asi:

if alltrim(str(t)) <> Alltrim(Str(a+b+c))
alert('error en sumatoria')
endif
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2112
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: error en comprobatoria de suma

Postby ACC69 » Mon May 11, 2015 10:14 pm

postinelli wrote:gracias

por ahora Round() fue la solucion facil, ojala sea la definitiva
se ve que la suma trabaja con muchos decimales

Adrian, te mandé email por privado para no molestar en el foro

Pablo



Gracias Ing. Postinelli, reviso y te comento si me compilo bien en xHarbour.

Gracias y saludos .

Atte: Adrian C. C.
acc69@hotmail.com
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 23 guests