Problema con datos numericos


#1

Hola, la aplicacion que estamos ealizando tiene que ser capaz de
calcular los intereses brutos, netos y el importe a vencimiento a partir
de una serie de datos: el dinero a invertir, el tiempo de inversion y el
TAE.

Para ello en el modelo tengo la siguiente funcion:

def calcula_tin_bruto_neto_vencimiento(dinero = 0, tae = 0, meses = 0)
# tin=interes nominal—>http://es.wikipedia.org/wiki/Interés
#n=Fraccion en que el interes va a ser aplicado
#una vez al mes->12 al año, n=12
#una vez cada 6 meses->2 al año, n=6

self.dinero_a_invertir == BigDecimal.new("dinero") if dinero > 0
self.meses == BigDecimal.new("meses") if meses > 0
self.tae == BigDecimal.new("tae") if tae > 0

n=12/self.meses
#raise n.inspect
tin1=(1+(self.tae/100))**(1/n)
------->raise tin1.inspect
tin =(tin1-1)*n
self.intereses_brutos

=self.dinero_a_invertir*(tin/100)(self.meses/12)
self.intereses_netos=self.intereses_brutos-(self.intereses_brutos
0.18)
self.importe_a_vencimiento=self.dinero_a_invertir+self.intereses_netos
self.save
end

El problema lo tengo en la linea que marco con -------> el raise me saca
este resultado:

#BigDecimal:4038118,‘0.1E1’,4(24) es decir 0.1E1=1

Sin embargo haciendolo con excel el resultado es de 1.018… El problema
es que en la siguiente linea le resto la unidad pues todos los calculos
dejan de servir.

He mirado en la documentacion de ruby:
http://www.ruby-doc.org/stdlib/libdoc/bigdecimal/rdoc/classes/BigDecimal.html
y se supone que debe servir para casos en los que los decimales son
parte importante.


#2

El día 13/05/09 18:19 +0200, Jose vicente Ribera pellicer escribió:

#una vez al mes->12 al año, n=12
#una vez cada 6 meses->2 al año, n=6

self.dinero_a_invertir == BigDecimal.new("dinero") if dinero > 0
self.meses == BigDecimal.new("meses") if meses > 0
self.tae == BigDecimal.new("tae") if tae > 0

Deberías de probar con:
self.dinero_a_invertir == BigDecimal.new(dinero) if dinero > 0

(Fíjate en las comillas)

– Gaizka


#3

2009/5/13 Jose vicente Ribera pellicer
removed_email_address@domain.invalid:

tin1=(1+(self.tae/100))**(1/n)

Yo diría que que en algún punto del cálculo se está haciendo un cast
de self.tae a entero ¿puedes probar así?:

tin1=(1.0+(self.tae/100.0))**(1.0/n.to_f)

Creo que en general te sirve con floats, puedes pasar de BigDecimal
¿no?.

Haz pruebas en irb de éstos cálculos, ahorras tiempo seguro.


#4

El problema era que estaba haciendo cast. He puesto las instrucciones
como deci Daid y hemos tocado la especificacion de la tabla ajustando
los valores de precision y scale de los datos decimales.

S2


#5

On Jueves, 14 de Mayo de 2009 19:00:00 Jose vicente Ribera pellicer
escribió:

Como decia anteriormente ya consigo que en la tabla aparezcan los datos
con dos decimales. Con el metodo number_with_precision(dato, numero de
decimales a mostrar) no hay mas problema.

Ahora me han pedido que los digitos aparezcan con la coma de los
millares, es decir en vez de 10000.45 deberia aparecer 10,000.45. He
estado anvegando y por el momento no he encontrado ninguna funcion que
lo implemente. Si alguien sabe de alguna se lo agradeceria.

S2

La misma funcion number_with_precision te permite hacerlo:
number_with_precision(10000.45325, :precision => 2, :separator => ‘,’,
:delimiter => ‘.’)


#6

Como decia anteriormente ya consigo que en la tabla aparezcan los datos
con dos decimales. Con el metodo number_with_precision(dato, numero de
decimales a mostrar) no hay mas problema.

Ahora me han pedido que los digitos aparezcan con la coma de los
millares, es decir en vez de 10000.45 deberia aparecer 10,000.45. He
estado anvegando y por el momento no he encontrado ninguna funcion que
lo implemente. Si alguien sabe de alguna se lo agradeceria.

S2


#7

La misma funcion number_with_precision te permite hacerlo:
number_with_precision(10000.45325, :precision => 2, :separator => ‘,’,
:delimiter => ‘.’)

Usando este helper asi me han salido una serie de erores, finalmente
mirando un poco el api me ha funcionado implementandolo de esta forma (
la Api vieja):

#Primero calculo el dato con precision 2
<%-dato= number_with_precision(dato,2) %>
#Le doy el aspecto visual que me interesa

<%= number_with_delimiter(dato, ".", ",") %>

por si alguien puede estar interesado en el tema dejo la direccion:
http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#M001654

S2