J'essaie d'obtenir une fraction d'un nombre décimal dans Rails. Par exemple, j'ai un numéro, "1.23" et je veux obtenir "23". C'est peut-être trop facile, mais est-ce que quelqu'un a une idée de comment puis-je faire?
Je ne suis pas sûr que ce soit le moyen le plus simple de le faire - mais vous pouvez simplement fractionner le nombre en utilisant "." caractère - comme ceci:
number = 1.23
parts = number.to_s.split(".")
result = parts.count > 1 ? parts[1].to_s : 0
Essayez d'utiliser la méthode modulo:
1.23.modulo(1) => 0.23
Lisez plus ici: http://www.Ruby-doc.org/core-1.9.3/Numeric.html#method-i-modulo
Vous pouvez également convertir float en entier et le soustraire de la valeur float d'origine.
1.23 - 1.23.to_i => 0.23
n = 1.23
n.modulo(1)
=> 0.22999999999999998
n - n.to_i
=> 0.22999999999999998
Recommandé lire http://floating-point-gui.de/
Pour choisir la solution appropriée, vous devez comprendre le type avec lequel vous travaillez. Si vos valeurs sont Float (le type standard pour les nombres non entiers en Ruby), des réponses logiquement correctes telles que mod(1)
peuvent produire des résultats inattendus en raison de erreurs en virgule flottante . Dans tous les cas où Float est le type de données approprié à utiliser en premier lieu, cela est probablement acceptable.
Si les erreurs en virgule flottante sont pas acceptables, n'utilisez pas Float
! Ruby est livré avec le grand BigDecimal
class qui est beaucoup plus précis au détriment des performances et dont la syntaxe est légèrement plus détaillée.
decimal = BigDecimal.new("1.23")
decimal.frac #=> 0.23
si vous connaissez la précision souhaitée, la solution pourrait être un peu plus rapide.
1.1234.modulo(1).round(4) #0.1234
a=1.23 #value of a will be 1.23
a=a-a.to_i #value of a will be 0.23
Après avoir tout essayé ... Je pense que la meilleure réponse est (num - num.to_i).abs
car cela fonctionne également pour les nombres négatifs.
par exemple.
(1,23 - 1,23.to_i) .abs = 0,23
(-1.23 - -1.23.to_i) .abs = 0.23
... "1,23" et je veux obtenir "23".
Supprimez simplement la partie entière et multipliez par 100.
((number - number.to_i) * 100).to_i