2013-01-25 20 views
6

W mojej bazie danych mam kilka "prawdziwych" pól.Nie można przekonwertować z podwójnej na zmienną

Herezje struktura:

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" 
      + ")"); 

Teraz co próbuję zrobić, to obliczyć 1RM tak, że mogę wstawić je do bazy danych.

Oto moja funkcja do tej pory:

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; 
} 

siedzę tutaj. Daje mi błąd "nie można przekonwertować z podwójnego na zmienny" dla onerm. Próbowałem rzucić wagę jako float za pomocą (Float) przed nim, próbowałem przy użyciu weight.floatValue() i nic nie wydaje się działać.

Odpowiedz

23

Czy próbowałeś tego?

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

To nie działa dla mnie .. –

2

Problem jest, że typ double jest większa precyzja niż float. Utracisz informacje, gdy wykonasz to zadanie. Właśnie dlatego kompilator nie pozwala ci tego zrobić. Jest podobny do tego, co się dzieje, gdy chcesz zrobić char b = a gdzie a jest int.

Korzystanie z rzutowania jawnego może pozwolić na kompilację, ale może dojść do utraty danych/precyzji.

EDIT:

Ponieważ w swoim pierwotnym pytaniu wszystkie wejścia do obliczeń są floats, literały zastosowanie pływaka. Na przykład 1.0278 jest podwójnym literałem. To znaczy. dołączyć f do stałych takich, że wszystkie obliczenia są pływaki i nie awansował do deblu:

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

co polecasz zrobić wtedy? – scarhand

+0

@scarhand Zobacz edycję, o używaniu literałów float. – frozenkoi

7

Co o takim podejściu?

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

jako bardziej ogólna odpowiedź na tytuł (ale nie specyficzna zawartość) na pytanie, rzucając od podwójnej do pływaka można zrobić tak:

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

lub jeśli po prostu musisz wyrazić 1.2 jako float na początek, a następnie użyć 1.2f.

Uwaga

  • float pojedynczej precyzji jest 32-bitowy i double jest podwójnej precyzji 64-bitowy, więc jest możliwe, aby stracić precyzję konwersji. Zobacz primitive data types documentation.
Powiązane problemy