2013-01-25 22 views
6

Nel mio database, ho un paio di campi "reali".non può convertire da double a float

Heres la struttura:

database.execSQL("create table " + TABLE_LOGS + " (" 
      + COLUMN_ID + " integer primary key autoincrement," 
      + COLUMN_ID_DAY_EXERCISE + " integer not null," 
      + COLUMN_REPS + " integer not null" 
      + COLUMN_WEIGHT + " real not null" 
      + COLUMN_1RM + " real not null" 
      + COLUMN_DATE + " integer not null" 
      + ")"); 

Ora quello che sto cercando di fare è calcolare dell'1RM modo che io possa inserire nel database.

Qui è la mia funzione finora:

public void createLog(long id_day_exercise, float reps, long weight) { 

    // create 1rm 
    // create date timestamp 

    float onerm = weight/(1.0278-(.0278*reps)); 
    long unixTime = System.currentTimeMillis()/1000L; 
} 

Sono bloccato qui. Mi sta dando l'errore "Impossibile convertire da doppio a float" per onerm. Ho provato a lanciare il peso come un float usando (Float) di fronte ad esso, ho provato a usare weight.floatValue() e niente sembra funzionare.

risposta

23

Hai provato questo?

float onerm = (float) (weigth/(1.0278-(.0278*reps))); 
+1

Questa cosa non funziona per me .. –

2

Il problema è che il tipo double è precisione superiore float. Perderai le informazioni quando effettuerai questo incarico. Ecco perché il compilatore non ti consente di farlo. È simile a ciò che accade quando si desidera fare char b = a dove a è un int.

L'utilizzo di un cast esplicito potrebbe consentire la compilazione, ma potrebbe verificarsi una perdita di dati/precisione.

EDIT:

Poiché nella tua domanda iniziale tutti gli ingressi al calcolo sono floats, letterali uso galleggiante. Ad esempio, 1.0278 è un valore letterale doppio. Cioè accodare f alle costanti tali che tutti i calcoli sono galleggianti e non sono promossi a doppie:

float onerm = weight/(1.0278f-(.0278f*reps)); 
+0

cosa mi consigliate allora? – scarhand

+0

@scarhand Vedi modifica, sull'utilizzo di valori letterali float. – frozenkoi

7

Che dire di questo approccio?

Float.valueOf(String.valueOf(your_double_variable)); 
1

come una risposta più generale al titolo (ma non il contenuto specifico) della questione, gettando da una doppia a un galleggiante può essere fatto in questo modo:

double d = 1.2; 
float f = (float) d; 

O se semplicemente è necessario esprimere 1.2 come float per iniziare, quindi utilizzare 1.2f.

Nota

  • float è precisione singola a 32 bit e double è doppia precisione a 64 bit ed è quindi possibile perdere precisione nella conversione. Vedi lo primitive data types documentation.
Problemi correlati