2013-05-13 12 views
6

Dato una variabile x = 12.3442Trova il numero di cifre decimali di una variabile in MATLAB

Desidero conoscere il numero di cifre decimali della variabile. In questo caso il risultato sarebbe 4. Come posso fare questo senza prove ed errori?

+6

Non è possibile - i numeri reali sono quasi sempre rappresentati come numeri in virgola mobile per il quale "il numero di cifre decimali" non ha senso . –

+3

@ H2CO3 Ovviamente ha senso. Sì, c'è un problema derivante dalla natura approssimativa della rappresentazione in virgola mobile. Risolvere è parte della domanda. Converti la rappresentazione binaria in decimale (succede ogni volta che stampi un numero sullo schermo ...) e calcola quante cifre hai bisogno di lasciare dalla fine prima di contare le altre non zero. Ogni volta che esegui operazioni aritmetiche con numeri in virgola mobile perdi un po 'di precisione, quindi potresti dire che è impossibile fare operazioni aritmetiche su un computer - non è un pensiero molto produttivo, vero? – Szabolcs

+0

@Szabolcs No, non sto dicendo questo. Probabilmente non capisci il problema, ma i calcoli in virgola mobile non sono esatti ei ripristini dipendono dalla rappresentazione. È sempre l'utente che deve specificare con quale precisione vuole lavorare - non è implicito. –

risposta

3

Come accennato nei commenti, il "numero di cifre decimali" non ha senso nella maggior parte dei casi, ma credo che questo potrebbe essere quello che stai cercando:

>> num = 1.23400; 
>> temp = regexp(num2str(num),'\.','split') 

temp = 

    '1' '234' 
>> length(temp{2}) 

ans = 

    3 
+1

Non sembra funzionare per più di 4 cifre decimali: Prova: 'num = 1.23456789;' Ti dà 'ans = 4', un massimo di 4 cifre decimali. –

+2

Sì. Qualcosa come 'temp = regexp (num2str (num, 15), '\.', 'Split')' funziona, ma non sarà sempre così. Mi piacerebbe imparare qualcosa di meglio. –

+0

Non sapevo del secondo input di num2str. Anche se non a prova di proiettile, credo che in questo caso sarebbe assolutamente utile allo scopo. –

5

Ecco una compatta modo:

y = x.*10.^(1:20) 
find(y==round(y),1) 

dal presupposto che x è il vostro numero e 20 è il numero massimo di cifre decimali.

0
%If number is less than zero, we need to work with absolute value 
if(value < 0) 
    num = abs(value); 
else 
    num = value; 
end 
d = 0; % no of places after decimal initialised to 0. 
x = floor(num); 
diff = num - x; 
while(diff > 0) 
    d = d + 1; 
    num = num * 10; 
    x = floor(num); 
    diff = num - x; 
end 

%d is the required digits after decimal point  
0

Per un numero a e l'assunzione che avrà meno di 28 cifre decimali qui è qualcosa di compatto e affidabile:

numDP = length(num2str(a, 28)) - strfind(num2str(a, 28),'.'); 

Conversione in stringa fa buon uso delle funzioni di confronto stringa in Matlab, anche se è un po 'maldestro.

0

Opere in tutte le condizioni (se si tratta di decimali):

temp = strsplit(num2str(num),'.'); 
result = length(temp{2}); 
Problemi correlati