Forum: Italian Ruby user group operazioni in virgola mobile con ruby

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
antonio g. (Guest)
on 2007-12-26 12:47
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
David (Guest)
on 2007-12-26 13:08
(Received via mailing list)
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...

:-/
Il N. (Guest)
on 2007-12-26 13:20
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"
Oscar D. (Guest)
on 2007-12-26 14:04
printf("%.2f",34.3456)

Oscar
antonio g. (Guest)
on 2007-12-26 21:52
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)
Daniele A. (Guest)
on 2007-12-27 09:52
(Received via mailing list)
On Dec 26, 2007 8:52 PM, antonio guerra <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
Oscar D. (Guest)
on 2007-12-27 11:33
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
Giovanni I. (Guest)
on 2007-12-27 12:12
(Received via mailing list)
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/
Antonio D. (Guest)
on 2007-12-28 12:59
'%.2f' % (3.1416 * 6.35265)
Giovanni C. (Guest)
on 2008-01-06 20:02
(Received via mailing list)
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/

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
This topic is locked and can not be replied to.