2013-01-25 5 views
6

제 데이터베이스에는 두 개의 "실제"필드가 있습니다.double에서 float으로 변환 할 수 없습니다.

을 Heres 구조 :

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

지금 내가 뭘하려고 내가 데이터베이스에 삽입 할 수 있도록 1RM을 계산이다. 내가 여기에 붙어

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

:

여기에 지금까지 내 기능입니다. onerm에 대해 "double에서 float으로 변환 할 수 없습니다"오류가 발생합니다. 나는 그것을 앞에 (플로트)를 사용하여 플로트로 무게를 캐스팅 시도했다, 나는 weight.floatValue()를 사용하여 시도하고 아무것도 작동하는 것.

답변

23

시도해 보셨습니까?

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

이 문제는 저를 위해 작동하지 않습니다 .. –

2

문제는 double 유형 float보다 높은 정밀도 것입니다. 할당을하면 정보가 손실됩니다. 컴파일러가 그렇게하지 못하게하는 이유입니다. char b = a의 a가 int 인 경우 수행 할 때와 비슷합니다.

명시 적 형변환을 사용하면 컴파일 할 수 있지만 데이터/정밀도가 손실 될 수 있습니다.

편집 : 계산에 대한 모든 입력이 floats, 사용 부동 소수점 리터럴은

원래의 문제입니다. 예를 들어 1.0278은 이중 리터럴입니다. 나는. 이 방법에 대한

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

내가 뭘 추천하나요? – scarhand

+0

@scarhand float 리터럴 사용에 대한 편집을 참조하십시오. – frozenkoi

7

무엇 : 모든 계산이 수레이며, 복식으로 승격되지 않도록 상수에 f을 추가?

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

float로 이중에서 캐스팅 문제의보다 일반적인 제목에 대한 답 (그러나 구체적인 내용은) 다음과 같이 수행 할 수 있습니다으로 :

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

을 또는 당신 경우 먼저 1.2을 float로 표현해야하며 1.2f을 사용해야합니다.

참고

  • float 단일 정밀도 32 비트이며 double는 변환의 정밀도를 잃게 할 수있다 배정도 있도록 64 비트이다. primitive data types documentation을 참조하십시오.
관련 문제