# Numeri float

**URL:** <https://www.ruby-forum.com/t/numeri-float/236155>\
**Category:** IT\
**Created:** [August 10, 2013, 3:18pm UTC](https://www.ruby-forum.com/t/numeri-float/236155 "2013-08-10T15:18:59Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![alcina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/a587f6/32.png) [@alcina](https://www.ruby-forum.com/u/alcina)\
**Post date:** [August 10, 2013, 3:18pm UTC](https://www.ruby-forum.com/t/numeri-float/236155/1 "2013-08-10T15:18:59Z")

</div>

Non mi è particolarmente chiaro il discorso alle differenze tra i numeri  
floating point calcolati e non.  
Ovvero:  
1.9 è un numero e ci siamo  
1.8 + 0.1 è diverso

irb(main):023:0\> 1.8 + 0.1  
=\> 1.9000000000000001

e va bene  
Su un testo leggo la seguente frase condita da esempio:

Note that the difference between the two numbers  
is preciselyFloat::EPSILON:  
Float::EPSILON # =\> 2.22044604925031e-16  
(1.8 + 0.1) - 1.9 # =\> 2.22044604925031e-16

però se prendo altri numeri la cosa cambia:

irb(main):020:0\> (2.2 + 0.1) - 2.3  
=\> 4.440892098500626e-16  
irb(main):021:0\> (42.2 + 0.1) -42.3  
=\> 7.105427357601002e-15

Insomma, senza passare di lenti BigDecimal, qual è la strada migliore  
per verificare l’uguaglianza tra  
2.2 + 0.1 e 2.3?

Grazie in anticipo.

---

<div class="post-metadata">

**Author:** ![renoir](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/df705f/32.png) [@renoir](https://www.ruby-forum.com/u/renoir)\
**Post date:** [August 10, 2013, 3:28pm UTC](https://www.ruby-forum.com/t/numeri-float/236155/2 "2013-08-10T15:28:00Z")

</div>

On Saturday, August 10, 2013 at 3:18 PM, Renato L. wrote:

> Su un testo leggo la seguente frase condita da esempio:  
> irb(main):021:0\> (42.2 + 0.1) -42.3
> 
> * * *
> 
> Ml mailing list  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ([mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid))  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

Sia minitest che rspec usano metodi simili tra loro: controllare che il  
valore sia in un range ristretto, denominato delta:  
Minitest:

> **[Module: MiniTest::Assertions (Ruby 1.9.3)](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/minitest/unit/rdoc/MiniTest/Assertions.html#method-i-assert_in_delta)**
>
> For comparing Floats. Fails unless exp and act are within delta of each other. | Module : MiniTest::Assertions - Ruby 1.9.3

Rspec:  
[https://www.relishapp.com/rspec/rspec-expectations/v/2-14/docs/built-in-matchers/be-within-matcher](https://www.relishapp.com/rspec/rspec-expectations/v/2-14/docs/built-in-matchers/be-within-matcher)

Federico

---

<div class="post-metadata">

**Author:** ![renoir](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/df705f/32.png) [@renoir](https://www.ruby-forum.com/u/renoir)\
**Post date:** [August 10, 2013, 6:32pm UTC](https://www.ruby-forum.com/t/numeri-float/236155/3 "2013-08-10T18:32:39Z")

</div>

Ciao ,  
Non basterebbe la funzione round per effettuare la comparazione ?

> **[Class: Float (Ruby 1.9.3)](http://www.ruby-doc.org/core-1.9.3/Float.html#method-i-round)**
>
> Rounds flt to a given precision in decimal digits (default 0 digits). Precision may be negative. Returns a floating point number when ndigits is more than zero. | Class : Float - Ruby 1.9.3

(2.2 + 0.1).round(2) == 2.3.round(2)

Daniele.

Il giorno 10 agosto 2013 15:27, Federico R.  
\<[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> ha scritto:

---

<div class="post-metadata">

**Author:** ![renoir](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/df705f/32.png) [@renoir](https://www.ruby-forum.com/u/renoir)\
**Post date:** [August 14, 2013, 12:17am UTC](https://www.ruby-forum.com/t/numeri-float/236155/4 "2013-08-14T00:17:32Z")

</div>

All’Euruko di questo anno Xavier N. ha fatto un talk su questo tipo  
di problemi, se vuoi trovi il video e le slide del video a questo  
indirizzo [NameBright - Coming Soon](http://euruko2013.org/#videos).  
Forse può toglierti qualche dubbio e darti qualche idea.

---

<div class="post-metadata">

**Author:** ![renoir](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/df705f/32.png) [@renoir](https://www.ruby-forum.com/u/renoir)\
**Post date:** [August 29, 2013, 9:51am UTC](https://www.ruby-forum.com/t/numeri-float/236155/5 "2013-08-29T09:51:43Z")

</div>

Il problema che 0.1 non ha una rappresentazione binaria finita;  
analogamente a 1/3 che non ha una rappresentazione decimale finita.

L’unica maniera corretta in generale di verificare l’uguaglianza fra  
numeri  
in virgola mobile a meno di un piccolo delta, come giustamente ha  
scritto  
Federico. Si verifica cio che sia

abs(x-y) \< epsilon

2013/8/10 Renato L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![renoir](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/df705f/32.png) [@renoir](https://www.ruby-forum.com/u/renoir)\
**Post date:** [August 10, 2013, 11:27pm UTC](https://www.ruby-forum.com/t/numeri-float/236155/6 "2013-08-10T23:27:07Z")

</div>

Per ora me la sono cavata con una porcheria di questo tipo:

irb(main):019:0\> ((2.2 + 0.1) - 2.3).abs \< 0.00000000001  
=\> true

non un gran che…
