2012-09-13 23 views

Respuesta

7

No estoy seguro de si es la forma más fácil de hacerlo, pero simplemente puede dividir el número con "." personaje - como esto:

number = 1.23 
parts = number.to_s.split(".") 
result = parts.count > 1 ? parts[1].to_s : 0 
+0

que funciona! gracias EfratBlaier. – yagmurdursun

+3

lectores futuros, no utilice este enfoque. Puede funcionar en un caso simplista, pero saltará en cualquier escenario que tenga en cuenta la configuración regional. Aunque no es muy propenso a errores en Ruby, que codifica "." Como el delimitador de coma flotante, promovería el mal hábito para ser utilizado con otros lenguajes menos permisivos.Utilice funciones matemáticas para operaciones matemáticas, vea las respuestas a continuación. –

37

intenta utilizar el método de módulo:

1.23.modulo(1) => 0.23 

Leer más aquí: http://www.ruby-doc.org/core-1.9.3/Numeric.html#method-i-modulo

o puede convertir flotante a un entero y restar que a partir de valor flotante originales .

1.23 - 1.23.to_i => 0.23 
+0

gracias Eugene, lo intenté también. – yagmurdursun

+3

Me sale '(1.1) .modulo (1) # 0.10000000000000009' que es menos que aceptable. –

+0

Y obtengo 1.234 - 1.234.to_i # 0.2399999999999999 que es menos que aceptable. Esto es típico de arithemetic punto flotante. Entonces, ¿es el camino de EfratBlaier el mejor entonces? – labyrinth

1
a=1.23 #value of a will be 1.23 
a=a-a.to_i #value of a will be 0.23 
2

si sabe que su precisión deseada, esto podría ser un poco más rápido a la solución to_s.

1.1234.modulo(1).round(4) #0.1234 
2

Decidir sobre la solución adecuada requiere comprender el tipo con el que está trabajando. Si sus valores son Float (el tipo estándar para números no enteros en Ruby), entonces las respuestas lógicamente correctas como mod(1) pueden producir resultados inesperados debido a floating point errors. Para cualquier caso en que Float sea el tipo de datos adecuado para usar en primer lugar, es probable que sea aceptable.

Si los errores de punto flotante son no aceptable, no use Float! Ruby viene con la gran clase BigDecimal que es mucho más precisa a costa del rendimiento y con una sintaxis ligeramente más detallada.

decimal = BigDecimal.new("1.23") 
decimal.fraC#=> 0.23 
0

Después de probar todo lo ... siento la mejor respuesta es (num - num.to_i).abs, ya que también funciona para los números negativos.

p. Ej.

(1,23 - 1.23.to_i) .abs = 0,23

(-1,23 - -1.23.to_i) .abs = 0,23

Cuestiones relacionadas