2015-12-18 24 views
8

riferimento alla documentazione di BigDecimal classe,Se utilizzare String o Integer in BigDecimal in Ruby

n,m = a.precs
prec restituisce il numero di cifre significative (n) e numero massimo di cifre significative (m) di a.

Sono perplesso dal seguente output relativo a BigDecimal.

require 'bigdecimal'  
BigDecimal.new('1').precs # => [9, 18] 
BigDecimal.new(1).precs # => [9, 27] 

non riesco a capire perché quando viene passato un String, il numero massimo di cifre significative è inferiore rispetto a quando è passato un Fixnum.

Inoltre causerà problemi di precisione?

+0

Il costruttore prende un secondo argomento se si desidera la coerenza: 'BigDecimal.new ('1', 27) .precs' per esempio. E la documentazione dice che il "numero di cifre significative è determinato dal valore iniziale" se non lo specifichi tu stesso. –

+0

@muistooshort il tuo diritto che possiamo specificarlo. Ma la mia domanda era: perché i precs sono diversi in primo luogo? – abhinavmsra

+3

Qui ci sono più punti dati. Le seguenti osservazioni si riferiscono a stringhe contenenti solo il carattere '1' (ad es.," "111111" ') e numeri le cui cifre sono tutte' '1' (ad esempio,' 111111'). Per meno di caratteri '10', viene restituito' [9,18] '. Per meno di cifre '10', viene restituito' [9,27] '. Tra '10' e' 18' caratteri * o * cifre, '[18,27]' viene restituito (vale a dire, la stessa tupla viene restituita per entrambe le stringhe e numeri), tra '19' e un numero maggiore di caratteri o cifre , '[27,36]' viene restituito. A parte: ti suggerisco di aggiungere 'require 'bigdecimal'' al tuo codice. –

risposta

3

Se è possibile leggere il codice C, è possibile iniziare da https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L2509, ovvero l'inizializzatore per qualsiasi oggetto BigDecimal. Se segui quel codice al metodo successivo, che è BigDecimal_new noterai che quando viene passato un argomento intero ci sono ancora alcuni passaggi da eseguire prima di allocare e creare un oggetto decimale grande interno invece di passare un argomento stringa.

In ogni caso, non dovresti preoccuparti della perdita di precisione - gli attributi di cifre significative sono più come suggerimenti che valori assoluti. Anche la documentazione lo menziona: The actual number of significant digits used in computation is usually larger than the specified number.