Metodo che restituisce un numero a partire dalla sua decina

di il
5 risposte

Metodo che restituisce un numero a partire dalla sua decina

Ciao a tutti,

sto cercando di creare un metodo che mi permetta di avere come valore di ritorno un int con la seguente proprietà:
-qualsiasi sia un numero intero n d'entrata, l'uscita dovrà essere costituita dalle cifre del numero n dalla decina in poi.

Mi spiego meglio con degli esempi: 224->24, 1243252->52, 4->0,..

Ecco quanto avevo pensato:
public static int ritornoDecina(int n){
    double x=n/100;
    int y=(int)x;
    int decina=(int)((x-y)*100);
	return decina;
}
(La logica che sta dietro a tale algoritmo è la seguente:
-divido il numero per 10 in modo tale da ottenere dopo la virgola il valore che a me interessa (ex. 244->2,44)
-calcolo la parte intera di quanto ho appena calcolato (2,44->2), approssimando a integer un valore double attraverso l'arrotondamento mediante Cast
-calcolo la parte decimale sottraendo il valore double alla sua parte intera (2,44-2=0,44)
-moltiplico il tutto per 100 e lo registro in una variabile int(0,44*100=44,0->44) )


Tuttavia, provando ad invocare il metodo in un Tester, il risultato di "decina" mi risulta sempre 0. Idee?

5 Risposte

  • Re: Metodo che restituisce un numero a partire dalla sua decina

    Giammarco ha scritto:


    Mi spiego meglio con degli esempi: 224->24, 1243252->52, 4->0,..
    Uhm, no 4->4 non 0 (sei comunque entro il centinaio).

    Se vuoi solo le ultime 2 cifre (quelle meno significative), allora ti basta fare il "modulo" 100, ovvero avere il resto della divisione per 100. In Java l'operatore %

    Se non lo conosci o non ti è stato spiegato, bastano le operazioni classiche - * / ma NON c'è bisogno di andare sui double!
  • Re: Metodo che restituisce un numero a partire dalla sua decina

    andbin ha scritto:


    vuoi solo le ultime 2 cifre (quelle meno significative), allora ti basta fare il "modulo" 100, ovvero avere il resto della divisione per 100. In Java l'operatore %
    Hai ragione! Alla fine è stato molto più semplice proprio come hai detto tu. Ma se volessi andare a scovare l'errore nella mia precedente formulazione, quale sarebbe?
  • Re: Metodo che restituisce un numero a partire dalla sua decina

    Giammarco ha scritto:


    Ma se volessi andare a scovare l'errore nella mia precedente formulazione, quale sarebbe?
    L'errore principale è che n/100 è una divisione "intera". Non è floating-point, perché entrambi gli operandi sono int. Quindi 1243252/100 dà come risultato un int 12432 e non un double 12432,52. Pertanto non ci sarà differenza tra x e y.

    Se vuoi che la divisione sia floating-point, uno dei due operandi deve essere double (o al limite float). Il modo più banale è specificare il 100 come costante double:
    double x=n/100D;
    oppure
    double x=n/100.0;    // preferibile, perché D si può confondere con 0
    In entrambi i casi la costante è double. L'altro operando verrà portato temporaneamente a double per la divisione.

    Questo risolve il problema tecnico ma resta un altro grosso problema concettuale: andando ad usare valori floating-point, entrano in gioco gli errori e le imprecisioni dovute alla rappresentazione e ai calcoli in floating-point. E il problema lo puoi "vedere" molto chiaramente se (con il metodo corretto come indicato) passi come input il valore 12345678 perché ottieni come risultato 77.

    Ecco perché in questo scenario i valori floating-point non vanno usati.
  • Re: Metodo che restituisce un numero a partire dalla sua decina

    Grazie mille, molto chiaro

    (Mettere una "D" dopo un valore numero permette al compilatore di leggere quel valore come un double?)
  • Re: Metodo che restituisce un numero a partire dalla sua decina

    Giammarco ha scritto:


    (Mettere una "D" dopo un valore numero permette al compilatore di leggere quel valore come un double?)
    Valori literal double: 123D oppure 123d
    Valori literal float: 123F oppure 123f

    Se metti il punto decimale es. 123.4 senza suffisso d/D/f/F allora è double per default.
Devi accedere o registrarti per scrivere nel forum
5 risposte