Problema como decimales.

663 views
Skip to first unread message

Julián May

unread,
May 4, 2014, 4:29:11 PM5/4/14
to publice...@googlegroups.com
Hola que tal buen día. 

Tengo un pequeño problema con algunos clientes. que en su facturación quiere que aparezcan dos decimales. 

en México la tasa del iva es el 16%. 

Tengo un monto total de 10.000 

el calculo es el siguiente .50 / 1.16  = .4310344827586207  

Subtotal .4310344827586207   * 2000 =  

Iva 862.06896551724149 * .16 = 137.9310344827586

Total = 862.06896551724149  + 137.9310344827586 = 10.000 

Con la calculadora me da todo estos dígitos para llegar al total deseado pero los clientes solo quieren de a dos decimales
eh estado probado con set decimal, redondearlos, truncarlos pero nada no llego al resultado se pasa por centavos o le falta centavos el problema que algunos clientes
ya no les quieren pagar sus facturas por esa diferencia. 


Como puedo solucionar este inconveniente?

Gracias saludos.




andrea Kummers

unread,
May 4, 2014, 4:56:43 PM5/4/14
to publice...@googlegroups.com
Buenas Julián:
 
En Colombia ocurre igual,........, en los almacenes colocan los precios REDONDEADOS, por ejemplo:
 
Un traje vale $ 100.000 devaluados pesos colombianos.
 
Entonces se toman los $ 100.000 y se divide por 1.16 para saber el precio base antes del IVA,...........,
 
Luego se toman los $ 86.206,90 con dos decimales y se restan de los $ 100.000
 
o sea el IVA es de $ 13.793.10.
 
Listos, creo que ningún gobierno va a reclamar el centavo o sea 0.01 de la aproximación.
 
Además en Colombia en cuestión de impuestos es obligado redondear al MIL más cercano, ......,
 
O sea la venta sería de $ 86.000 y el IVA de $ 14.000
 
Saludos
 
 
 
 

J. Enrique Ramos Menchaca

unread,
May 4, 2014, 6:31:00 PM5/4/14
to publice...@googlegroups.com
Prueba lo siguiente:

SET DECIMALS TO 2

lnCalculo = .50/1.16
lnSubtotal = TRANSFORM(lnCalculo* 2000,'999999999999.99') 
lnIVA = TRANSFORM(VAL(lnSubtotal) *.16,'999999999999.99')
lnTotal = TRANSFORM(VAL(lnSubtotal) + VAL(lnIVA),'999999999999.99') 

?lnCalculo
?lnSubTotal
?lnIVA
?lnTotal

Luis Salazar

unread,
May 4, 2014, 8:20:53 PM5/4/14
to publice...@googlegroups.com

Aplica la función Round o multiplica por 100 tomas la parte entera función INT y luego divides por 100
Enviado desde mi Huawei

"J. Enrique Ramos Menchaca" <jera...@gmail.com> escribió:

HernanCano

unread,
May 4, 2014, 11:08:44 PM5/4/14
to publice...@googlegroups.com
Dices que "incluso redondeaste".  Lo lamento pero no te creo: si redondearas, no tendrías diferencias de decimales.

Se redondea con la función ROUND(), como ya te respondieron.

Julián May

unread,
May 4, 2014, 11:53:41 PM5/4/14
to publice...@googlegroups.com
Hola web kummer gracias por el dato tendre que leer igual sobre los redondeos en cuestion de impuesto.



Hola J. Enrique Ramos  con tu solución me hacen falta dos centavos. Gracias por la respuesta.


Hola Likiliki en eso ando probando la función ROUND redondee  .50/1.16   y me dio .43   y me dije no creo que llegue al resultado sin antes probar pero con lo que me comentas y lo que me comenta Hernan Cano llegue al resultado aquí subo la imagen al parecer llegue al resultado seguiré probando no había utilizado esta función hasta ahora. Gracias.

Hola Hernan Cano  pues si redondee aunque no creas pero me quede en el primer redondeo y ya no seguí por que ya había intentado calculado fuera de fox y me quedaba primero .43 y al final no llegaba al resultado, pero leyendo lo que me dicen ya continué con la función y llegue al resultado.

Aquí la imagen seguiré probando con otras cantidades.. 
Muchas Gracias por la ayuda. Saludos.



Gracias buen inicio de semana.

Bendiciones.





 
Decimales.png

Julián May

unread,
May 5, 2014, 12:15:22 AM5/5/14
to publice...@googlegroups.com
Hola de nuevo creo que mi problema aún sigue :/.

Escribiré el escenario.   

Se tiene un concepto que neto cuesta .50 centavos.  .50 * 2000 me da 1000.  

Ahora bien yo al momento de facturar tengo que desglosar los impuestos el IVA. o las retenciones. 

bien si yo divido .50 / 1.16 me da el siguiente resultado .4310344827586207  
 ahora bien yo en mi tabla de productos y servicios el precio de venta yo grabo .43 con dos decimales.  
entonces al momento de facturar cuando selecciono el concepto y lo multiplico por 2000 
.43 * 2000  obtengo 860  
y el 16% de 860 * .16  = 137.6 

a lo que el total sería 997.6 
y no son los 1000 exactos .. 

Como puedo implementar el Round() en está situación es donde ahora ando medio perdido.

Gracias saludos. 

Carlos Alfaro

unread,
May 5, 2014, 8:45:13 AM5/5/14
to publice...@googlegroups.com

Saludos estimado Julian:

 

Debido al resultado que se produce al manejar valores pequeños con pocos decimales, lo recomendable es que el cálculo del impuesto se aplique al total del producto, por ejemplo:

 

Precio bruto (incluyendo impuesto):     0.50

Cantidad a facturar: 2,000 unidades

Valor a facturar: 1,000

 

La factura se compone de la siguiente manera:

 

2000 * .50 = 1000 / 1.16 = 862.07 * .16 = 137.93 + 862.07 = 1000

 

Para que te de el mismo resultado con formula en VFP debes redondear las siguientes las remarcadas de rojo.

 

En Guatemala se debe establecer los precios brutos (incluyendo el impuesto), creo que así te evitas las complicaciones sobre el impuesto individual por unidad. Asi que cuando se quiere determinar el precio neto se hace sobre el total y no individualmente.

 

Espero que con eso podas resolverlo.

 

Bendiciones.

 

Carlos Alfaro

Alfonso Arce Silvestre

unread,
May 5, 2014, 9:30:17 AM5/5/14
to Comunidad de Visual Foxpro en Español
Prueba con esto, cambia el tipo a Double, asi lo solucione yo

Alejandro Isla

unread,
May 5, 2014, 10:02:08 AM5/5/14
to publice...@googlegroups.com
Creo que el error se origina en el concepto de calcular sobre el costo unitario del producto. Al tener grandes volúmenes de ventas, los errores se multiplican por dicho volumen de ventas.

En tu ejemplo de 0.50 * 2000, si tenes un error de 0.001 en tu calculo (insignificante) al multiplicar por 2000 te origina un error de 2 (notorio).

¿Que te impide hacer los cálculos sobre el total (unitario * cantidad) y no sobre el precio unitario?

Volviendo a tu ejemplo

0.50 * 2000

Con unitario
 NETO = (.50 / 1.16) *2000 = .43 * 2000 = 860ºº

Manejando los totales

 NETO = (.50 * 2000)  / 1.16 = 1000 / 1.16 = 862.09

Repito, al multiplicar, tambien multiplicas tu error, tu solución entonces es evitar eso.

Saludos, Alejandro

sergio alejandro garcia mendez

unread,
May 5, 2014, 11:41:34 AM5/5/14
to publice...@googlegroups.com
mira yo tube ese problema use esta funcion de Microsoft que ellos mismo dicen que si han tenido esos problemas


Function iva
Lparameters num

mpay = num
mpay2 = gcgraiva
mytotal = mpay*mpay2
test=Str(mytotal,Len(Str(mytotal)),Len(Str(mytotal)))
u=Round(Val(test),2)

Return u
Endfunc

donde gcgraiva es el iva y con eso no e tenido problemas hasta el momento, ya que el round da problemas amigo y si deseas sin iva

Function siniva
Lparameters num

mpay = num
mytotal = mpay
test=Str(mytotal,Len(Str(mytotal)),Len(Str(mytotal)))
a=Round(Val(test),2)

Return a
Endfunc
--
Sergio A. García
correo tayi...@gmail.com

Julián May

unread,
May 6, 2014, 11:32:53 AM5/6/14
to publice...@googlegroups.com
Hola que tal nuevamente. 

Aquí de nuevo, 

Implemente la función que me comenta sergio y los parámetros los maneje en doubl como comenta aarces

function CalcularIva(dTotalImporte as Double, dTotalIva as Double)

private pdTotalIva, pdTotal, pdIva, pdResultado    Adjuntar un archivo
    pdIva = dTotalIva / 100 
pdTotal = dTotalImporte * pdIva 
pdTotalIva = Str(pdTotal,Len(Str(pdTotal)),Len(Str(pdTotal)))
pdResultado = Round(Val(pdTotalIva),2)

Return pdResultado  
endfunc 

aquí les muestro dos imágenes de dos importes diferentes eh llegado al resultado muchas gracias. :) .. 
Seguiré probando y les comento.

Saludos


Henry Martinez

unread,
May 6, 2014, 11:47:16 AM5/6/14
to publice...@googlegroups.com
El problema es el error por redondeo, la solución no es fácil. E igual,
cualquier solución que implementes no va ser del todo exacta.

Y dependera de lo desea el Cliente.

Que es lo que desea el cliente en la mayoria de los casos en que el
valor del Subtotal de la Factura, lo multiplique por le % de IVA y
obtenga el valor del IVA.

Entonces haz eso. Y en el caso que imprimas el valor del IVA por cada
item, para que no se note el error por redondeo, imprime el valor del
IVA de cada item con tres o cuatro decimales. Si sumas los parciales
de IVA, con cuatro decimales no cuadrará con el total del IVA de la
factura, pero no importa por que el error sera de menos de un centavo,
es decir no podra ser representado.

Asi el Contador, el Inventario y el Cliente todos felices...

Saludos

sergio alejandro garcia mendez

unread,
May 6, 2014, 12:10:48 PM5/6/14
to publice...@googlegroups.com
Te envio otra funcion es de truncado de decimales


Func ValorReal(p1,p2)
*
* Trunca el valor numérico
*

Local a,b,c,d,e,idecimal
Set Decimals To 10
Set Fixed On
   p1 = p1*gcgraiva
If Pcount()=1
   p1=Round(p1,2)
Endif
a=Str(p1,50,10) && Lleva a string
If At(".",a)<>0
   icharseparador="."
Else
   icharseparador=","
Endif
b=Subst(a,1,At(icharseparador,a)-1) && Extrae la parte entera
If Pcount()=2
   c=Subst(a,At(icharseparador,a)+1,p2) && Entra la parte decimal a tres dígitos
Else
   c=Subst(a,At(icharseparador,a)+1,10) && Entra la parte decimal a dos dígitos
Endif
d=(b+icharseparador+c) && Construye el monto final
Return(Val(d))

Endfunc

andrea Kummers

unread,
May 6, 2014, 12:21:29 PM5/6/14
to publice...@googlegroups.com
En Colombia cuando se compra algo en un almacén los artículos tienen un precio redondeado a algún valor sin decimales y eso debe incluir el IVA.
 
Entonces el dependiente saca una calculadora de bolsillo y un bolígrafo y la libreta de hacer facturas en forma manual y procede así:
 
Precio total del producto $ 10'000
 
$ 10.000 dividido por 1.16 da $ 8'620.689655172414
 
Redondeado a dos decimales da $ 8'620.68
 
Restando este valor de $ 10.000 da  $ 1'379.32 de IVA
 
Además creo que utilizan calculadoras que apenas dan dos decimales.
 
Entonces la factura queda así al escribirla:
 
Valor del producto $  8'620.68
Más IVA 16%        $  1'379.32
 
Valor a pagar        $ 10'000.00  
 
Saludos agradecido
 
 
 

HernanCano

unread,
May 8, 2014, 2:20:08 PM5/8/14
to publice...@googlegroups.com
Amigo Edgar:
Estoy plenamente de acuerdo con Alejandro Isla (y en gral con los que dicen que los redondeos no siempre darán exactitud) cuando dice:

>> Creo que el error se origina en el concepto de calcular sobre el costo unitario del producto.
>> Al tener grandes volúmenes de ventas, los errores se multiplican por dicho volumen de ventas.

Ahora: tú escribes:

>>> $ 10.000 dividido por 1.16 da $ 8'620.689655172414
>>> Redondeado a dos decimales da $ 8'620.68

Me parece que no es acertado: considero que el redondeo a dos decimales da $ 8'620.69 .

Pero evidentemente al resto de tu planteamiento sería el mismo (restar del gran total lo del impuesto), y el resultado final no daría con diferencias (es posible que obtengas diferencias en los "parciales", pero no en el total que debe ser tu máxima preocupación). Además si hay diferencia es sólo de un centavo, lo que sería lo normal (no me culpes si llegas a diferencias de dos o tres centavos, lo cual podría pasar si se hacen varios redondeos "intermedios", pero no siempre se daría ni en la generalidad de los casos).

Evidentemente tu solución es como la planteas, pero las posibles diferencias en los "parciales" son iledudibles, no por falla en Fox/VFP ni de ningún lenguaje de programación ni de un programa de computador, sino por la mecánica normal de obtener el dato. Como analistas y programadores debemos entender los conceptos (de programación y del cliente -su necesidad-) para "minimizar las diferencias".

Reply all
Reply to author
Forward
0 new messages