2.3. Reprezentowanie liczb z dowolną dokładnością

Problem

Chcemy wykonać obliczenia z dużą dokładnością, wykraczającą poza możliwości arytmetyki obiektów typu Float.

Rozwiązanie

Za pomocą obiektów typu BigDecimal możemy reprezentować liczby rzeczywiste z dowolną dokładnością.

require 'bigdecimal'

BigDecimal("10").to_s                              # => "0.1E2"
BigDecimal("1000").to_s                            # => "0.1E4"
BigDecimal("1000").to_s("F")                       # => "1000.0"

BigDecimal("0.123456789").to_s                     # => "0.123456789E0"

Porównajmy to z dokładnością dostarczaną przez typ Float:

nm = "0.123456789012345678901234567890123456789"
nm.to_f                            # =>  0.123456789012346
BigDecimal(nm).to_s                # => "0.123456789012345678901234567890123456789E0"

Dyskusja

Obiekty BigDecimal przechowują wartości zgodnie z tzw. ...

Get Ruby. Receptury now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.