Buenas,
me he encontrado con un ¿bug? del método divmod:
$ irb
1.divmod(0.5)
=> [2, 0.0]
1.divmod(0.2)
=> [4, 0.2]
está claro que en el segundo caso el resultado debería ser [5, 0.0].
He buscado en rubyforge y el único bug que parece relacionado es:
http://rubyforge.org/tracker/?group_id=426&atid=1698&func=detail&aid=14540
pero si ejecuto el script para probar si dicho bug te afecta, resulta
que en máquina la salida del script es correcta.
Mi ruby es ruby 1.8.5 (2006-08-25) [i486-linux] y estoy en Ubuntu 7.04.
Me parece algo tan gordo que dudo que nadie antes se haya dado cuenta.
¿Estoy haciendo algo mal? ¿Os ha pasado a vosotros?
Salu2,
On Dec 17, 2007, at 11:33 AM, Javier Vidal P. wrote:
$ irb
1.divmod(0.5)
=> [2, 0.0]
1.divmod(0.2)
=> [4, 0.2]
está claro que en el segundo caso el resultado debería ser [5, 0.0].
No he mirado los detalles, pero apuesto a que tiene que ver con que
0.2 se representa como un numero mas grande en realidad:
irb(main):020:0> sprintf("%.30f", 0.2)
=> "0.200000000000000011102230246252"
y al hecho de que hay un floor hacia menos infinito.
Si correcto de hecho no seria un bug.
– fxn
Ummm, pues tiene toda la pinta. Hay que tener cuidado con los floats.
Lo he resuelto utilizando big decimals:
$ irb
5 % 0.2
=> 0.2
require ‘bigdecimal’
=> true
divisor = BigDecimal(“0.2”)
=> #BigDecimal:b7a2fb7c,‘0.2E0’,4(8)
resto = 5 % divisor
=> #BigDecimal:b7a2d5d4,‘0.0’,4(12)
resto.to_i
=> 0
Muchas gracias, Xavier.
2007/12/17, Xavier N. [email protected]: