2010-11-07 39 views
2

Donc j'essaie de sortir du code pour convertir des nombres en chaînes. Cependant, j'ai remarqué que dans certains cas il ne conserve pas les deux dernières décimales. Par exemple, je tape 1,01 et 1,04 pour l'addition et je reviens à 2,04. Si je tape juste 1.05, il conserve le numéro et le renvoie exactement. Je comprends ce qui se passe sur les choses sont arrondies. Je ne sais pas comment l'empêcher d'être arrondie cependant. Devrais-je considérer simplement envoyer (1.01 + 1.04) à soi-même comme une seule entrée?Comment conserver mon numéro float dans ruby ​​

Avertissement! Je ne l'ai pas encore essayé donc je ne sais pas si son pris en charge:

user_input = (1.04+1.01) #entry from user 
user_input = gets.to_f 
user_input.to_test_string 

Ce que j'ai jusqu'à présent:

class Float 
    def to_test_string 

     cents = self % 1 
     dollars = self - cents 
     cents = cents * 100 

     text = "#{dollars.to_i.en.numwords} dollars and #{cents.to_i.en.numwords} cents" 

     puts text 
     text 
    end 
    end 
    puts "Enter two great floating point numbers for adding" 
    puts "First number" 
    c = gets.to_f 
    puts "Second number" 
    d = gets.to_f 
    e = c+d 
    puts e.to_test_string 
    puts "Enter a great floating number! Example 10.34" 
    a = gets.to_f 
    puts a.to_test_string 

Merci pour l'aide! Postez du code pour que je puisse essayer!

+0

Les méthodes Ruby 'en' et' numwords' sont-elles, ou quelque chose de l'ActiveSupport de Rails? –

+0

@Andrew Grimm, à mon avis honnête, il ne doit pas être et ne sera jamais dans le noyau ou stdlib de Ruby. – Nakilon

+0

@Nakilon: Je suis d'accord. Je demandais seulement parce que la question était étiquetée à l'origine seulement «ruby» et non «ruby-on-rails». –

Répondre

1

Ce n'est pas un problème avec ruby, ni votre code (bien que vous ayez besoin de vous débarrasser de .en.numwords); c'est a problem avec la représentation en virgule flottante binaire.

Vous devez utiliser un Fixnum ou un Bignum pour représenter la devise.

par ex.

class Currency 
    def initialize str 
     unless str =~ /([0-9]+)\.([0-9]{2})/ 
      raise 'invalid currency string' 
     end 
     @cents = $1.to_i * 100 + $2.to_i 
    end 
end