# Operazioni in virgola mobile con ruby

**URL:** <https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202>\
**Category:** IT\
**Created:** [December 26, 2007, 11:47am UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202 "2007-12-26T11:47:27Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [December 26, 2007, 11:47am UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/1 "2007-12-26T11:47:27Z")

</div>

una domanda da principiante puro:

voglio moltiplicare due numeri float, con un numero di decimali  
variabile, ed ottenere un risultato arrotondato alla seconda cifra  
decimale:

es. 3.1416 \* 6.35265 = 19.96

come faccio?

Ho trovato solo una istruzione ‘round’ ma mi arrotonda al numero intero  
piu’ prossimo (20 in questo caso).

Ho trovato questa soluzione

((3.1416_6.35265_100).round).to\_f/100

funziona, ma mi sembra tanto contorta e credo che ci sia qualche altra  
funzione piu’ semplice e veloce per questo caso.

Grazie a tutti, saluti ed auguri

---

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [December 26, 2007, 12:08pm UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/2 "2007-12-26T12:08:21Z")

</div>

Sono curioso anch’io di conoscere un modo migliore; quando è servito a me  
ho usato sprintf("%.2f", float\_num) e ha funzionato. Di sicuro non è molto  
elegante…

:-/

---

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [December 26, 2007, 12:20pm UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/3 "2007-12-26T12:20:42Z")

</div>

antonio guerra wrote:

> voglio moltiplicare due numeri float, con un numero di decimali  
> variabile, ed ottenere un risultato arrotondato alla seconda cifra  
> decimale:
> 
> es. 3.1416 \* 6.35265 = 19.96  
> come faccio?

si puÃ² usare il metodo round della classe BigDecimal:

require ‘bigdecimal’  
=\> true  
bd = BigDecimal((3.1416 \* 6.35265).to\_s).round(2)  
=\> #BigDecimal:b7c09c04,‘0.1996E2’,8(20)  
bd.to\_s(‘F’)  
=\> “19.96”

---

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [December 26, 2007, 1:04pm UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/4 "2007-12-26T13:04:12Z")

</div>

printf("%.2f",34.3456)

Oscar

---

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [December 26, 2007, 8:52pm UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/5 "2007-12-26T20:52:50Z")

</div>

Oscar Del ben wrote:

> printf("%.2f",34.3456)
> 
> Oscar

Ma printf() e’ solo un comando formattazione per la stampa di un numero  
arrotondato?  
Se cosi’ fosse in memoria mi rimane il numero originale: io, invece,  
devo avere un risultato arrotondato ai centesimi per inserirlo in una  
tabella di MySql.  
Trattandosi un un piccolo programmino di contabilita’ generale non posso  
permettermi, comunque, imprecisioni nei numeri trattati, pena eventuali  
squadrature dei conti fra dare ed avere (la quadratura dei conti e’  
l’ossessione di noi ragionieri)

---

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [December 27, 2007, 8:52am UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/6 "2007-12-27T08:52:52Z")

</div>

On Dec 26, 2007 8:52 PM, antonio guerra [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Ma printf() e’ solo un comando formattazione per la stampa di un numero  
> arrotondato?

Non credo ci sia un modo built-in, probabilmente ci sarà qualcosa in  
qualche ext ma del resto le classi aperte di Ruby sono belle e se ti  
serve solo quello basta sfruttarle 🙂

class Float  
def round(precision = nil)  
if precision.nil? then  
super()  
else  
if precision.is\_a? Integer and precision \> 0 then  
decimals = 10 \*\* precision  
(self \* decimals).round / decimals.to\_f  
else  
raise ArgumentError.new(“Argument must be a positive  
integer”)  
end  
end  
end  
end

irb(main):015:0\> f = 34.3456  
=\> 34.3456  
irb(main):016:0\> f.round  
=\> 34  
irb(main):017:0\> f.round(3)  
=\> 34.346  
irb(main):018:0\> f.round(2)  
=\> 34.35

---

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [December 27, 2007, 10:33am UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/7 "2007-12-27T10:33:18Z")

</div>

antonio guerra wrote:

> Oscar Del ben wrote:
> 
> > printf("%.2f",34.3456)
> > 
> > Oscar
> 
> Ma printf() e’ solo un comando formattazione per la stampa di un numero  
> arrotondato?  
> Se cosi’ fosse in memoria mi rimane il numero originale: io, invece,  
> devo avere un risultato arrotondato ai centesimi per inserirlo in una  
> tabella di MySql.  
> Trattandosi un un piccolo programmino di contabilita’ generale non posso  
> permettermi, comunque, imprecisioni nei numeri trattati, pena eventuali  
> squadrature dei conti fra dare ed avere (la quadratura dei conti e’  
> l’ossessione di noi ragionieri)

Allora printf Ã¨ un comando di output generico, comunque MAI usare in  
nessun linguaggio numeri decimali per operazioni in qui hai bisogno di  
essere preciso, usa invece i bignum piuttosto.

Comunuqe questa regola vale sempre

---

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [December 27, 2007, 11:12am UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/8 "2007-12-27T11:12:46Z")

</div>

Il giorno 26/dic/07, alle ore 20:52, antonio guerra ha scritto:

> Trattandosi un un piccolo programmino di contabilita’ generale non  
> posso  
> permettermi, comunque, imprecisioni nei numeri trattati, pena  
> eventuali  
> squadrature dei conti fra dare ed avere (la quadratura dei conti e’  
> l’ossessione di noi ragionieri)

Per evitare questo tipo di problemi quando l’arrotondamento è molto  
importante di solito si preferisce memorizzare i centesimi piuttosto  
che il valore con virgola, e dividerlo per 100 solo prima di  
visualizzarlo.

Es. [http://dist.leetsoft.com/api/money/](http://dist.leetsoft.com/api/money/)

---

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [December 28, 2007, 11:59am UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/9 "2007-12-28T11:59:39Z")

</div>

‘%.2f’ % (3.1416 \* 6.35265)

---

<div class="post-metadata">

**Author:** ![guerra](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/bb73d2/32.png) [@guerra](https://www.ruby-forum.com/u/guerra)\
**Post date:** [January 6, 2008, 7:02pm UTC](https://www.ruby-forum.com/t/operazioni-in-virgola-mobile-con-ruby/124202/10 "2008-01-06T19:02:17Z")

</div>

Giovanni I. ha scritto:

> importante di solito si preferisce memorizzare i centesimi piuttosto  
> che il valore con virgola, e dividerlo per 100 solo prima di  
> visualizzarlo.
> 
> Es. [http://dist.leetsoft.com/api/money/](http://dist.leetsoft.com/api/money/)

Esatto, i numeri in virgola mobile portano sempre con loro errori di  
arrotondamento che purtroppo non sono mai trascurabili. Il mio consiglio  
è di usare la classe BigDecimal della libreria standard.

Ciao,

```
Giovanni

```
