2009-12-19 9 views
47

Est-il possible de définir la précision d'affichage d'un flotteur en Ruby?Régler la précision d'affichage d'un flotteur en Ruby

Quelque chose comme:

z = 1/3 
z.to_s #=> 0.33333333333333 
z.to_s(3) #=> 0.333 
z.to_s(5) #=> 0.33333 

Ou dois-je remplacer la méthode to_s de Float?

+0

Qu'est-ce 'x'? ... –

+0

Désolé, x était une faute de frappe. –

+10

qu'en est-il de z.round (2), z.round (3)? – v4r

Répondre

34

Vous pouvez utiliser sprintf:

sprintf("%0.02f", 123.4564564) 
+4

Je préfère cela pour les moments où je veux la » .00" que' tour (2) 'ne donne pas. –

+9

C'est assez amusant, je n'ai jamais utilisé de rubis dans ma vie. Je ne sais pas comment écrire un bon programme mondial et je ne l'ai jamais fait. J'ai probablement juste googlé la question de l'OP et posté la réponse. –

+0

'met" Bonjour, Monde "' - Haha! Maintenant, vous savez comment écrire un programme mondial Hello! –

32

Je normalement le faire la conversion en code ouvert, quelque chose comme:

puts "%5.2f" % [1.0/3.0] 

Ruby appelle Kernel#format des expressions comme celle-ci, parce que chaîne a une core operator % defined dessus. Pensez-y comme printf pour Ruby si que les cloches pour vous sonne.

+8

Quelqu'un peut-il expliquer cela? – you786

+0

Jetez un coup d'œil à 'Kernel # format'. – maletor

+0

celui-ci m'a donné un personnage de premier plan. J'ai utilisé la réponse d'Andreas et il l'a fait sans le caractère d'espace. Je ne pouvais pas saisir la documentation sur ce ou bien j'expliquer pourquoi lol –

59

z.round(2) ou x.round(3) est la solution la plus simple. Voir http://www.ruby-doc.org/core-1.9.3/Float.html#method-i-round.

Cela dit, qui ne s'assurer qu'il ne dépasse pas le nombre de chiffres. Dans le cas de 1/3 c'est bien, mais si vous aviez dit 0.25.round(3) vous obtiendrez 0,25, pas 0,250.

+1

Pour votre information, cela a été ajouté à Ruby 1.9.2, il ne fonctionnera pas avec les versions antérieures – nbarraille

+1

+1 pour la note sur '(0,25). round (3) 'ne cède pas' 0.250' Voir la réponse d'Andreas Bonini pour contourner cela. –

0

Vous pouvez utiliser puts

z = #{'%.3f' % z}