2009-10-02 8 views
4

Une question rapide. J'écris:Sprintf dans Ruby

puts "%.3f %.4f %.5f" % [3.998877, 3.998877, 3.998877] 

et obtenir la sortie suivante:

3.999 3.9989 3.99888 

sprintf arrondit simplement les chiffres. Comment puis-je limiter cet arrondi?

Répondre

7
>> 3.998877.to_s[/^\d+\.\d{3}/].to_f 
=> 3.998 
>> 3.998877.to_s[/^\d+\.\d{4}/].to_f 
=> 3.9988 
+0

Pas mauvaise solution – gmile

1

vous aurez probablement besoin de tronquer les chiffres à la précision que vous voulez.

f = 3.1919183 
puts (f * 1000).truncate()/1000 
+0

désolé? Pouvez-vous donner un exemple? – gmile

+1

Je ne suis pas sûr de ce que vous entendez par "restreindre l'arrondissement". Plus précisément, quel résultat recherchez-vous dans votre exemple ci-dessus? –

+0

Je veux juste que mes numéros 'tel quel': 3.998 3.9988 3.99887 – gmile

-2

Pour obtenir les nombres tels quels, vous devez les stocker sous forme de chaînes. Dès que vous les représentez comme des flotteurs, vous perdez des informations sur la quantité de précision intégrée.

+0

Pourquoi ne pas les stocker comme des nombres rationnels à la place? –

+0

dépend de ce que vous voulez faire avec eux plus tard, je suppose. – Peter

2
>> def truncN f, digits 
>> t = 10.0 ** digits 
>> "%.#{digits}f" % ((f * t).truncate/t) 
>> end 
=> nil 
>> n 
=> 1.11181111 
>> "%.3f" % n 
=> "1.112" 
>> truncN n, 3 
=> "1.111"