2009-12-19 6 views
47

È possibile impostare la precisione di visualizzazione di un oggetto mobile in Ruby?Imposta la precisione di visualizzazione di un float in Ruby

Qualcosa di simile:

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

Oppure devo eseguire l'override del metodo Floatto_s?

+0

Che 'x'? ... –

+0

Siamo spiacenti, x era un refuso. –

+10

come su z.round (2), z.round (3)? – v4r

risposta

34

È possibile utilizzare sprintf:

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

Preferisco questo per le volte in cui voglio il ".00" che 'round (2)' non dà. –

+9

Questo è un po 'divertente, non ho mai usato il rubino nella mia vita. Non so come scrivere un programma Hello World e non l'ho mai fatto. Probabilmente ho cercato su Google la domanda dell'OP e ho postato la risposta. –

+0

'mette" Ciao, Mondo "' - Haha! Ora sai come scrivere un buon programma mondiale! –

32

Io normalmente solo fare la conversione in codice aperto, qualcosa di simile a:

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

Rubino chiede Kernel#format per le espressioni di questo tipo, perché stringa ha una core operator % defined su di essa. Pensalo come printf per Ruby se suona qualsiasi campanello per te.

+8

Qualcuno può spiegarlo? – you786

+0

Scopri 'Kernel # format'. – maletor

+0

questo mi ha dato un protagonista spaziale. Ho usato la risposta di Andreas e lo ha fatto senza il carattere spaziale. Non ho potuto afferrare la documentazione su questo altrimenti vorrei spiegare perché lol –

59

z.round(2) o x.round(3) è la soluzione più semplice. Vedi http://www.ruby-doc.org/core-1.9.3/Float.html#method-i-round.

Detto questo, ciò garantirà solo che non sia più di tante cifre. Nel caso di 1/3 va bene, ma se hai detto 0.25.round(3) otterrai 0,25, non 0,250.

+1

FYI, questo è stato aggiunto in Ruby 1.9.2, quindi non funzionerà con le versioni precedenti – nbarraille

+1

+1 per la nota su '(0.25). round (3) 'non cedendo '0.250' Vedi la risposta di Andreas Bonini per un modo per aggirare questo. –

0

È possibile utilizzare mette

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