2013-01-25 10 views
6

私のデータベースでは、私はいくつかの "実際の"フィールドがあります。ダブルからフロートに変換することはできません

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の場合、「ダブルからフロートに変換できません」というエラーが表示されます。私はそれの前に(フロート)を使用して、私はweight.floatValue()を使用しようとした何も動作するようにフロートとして体重をキャストしようとしました。

答えて

23

これを試しましたか?

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

このことは私のために働いていません.. –

2

問題がdoubleタイプfloatより高精度であることです。その割り当てを行うと情報が失われます。だから、コンパイラはあなたにそれをさせません。 char b = aのaがintの場合、何が起こるかと似ています。

明示的なキャストを使用するとコンパイルできますが、データ/精度の低下が発生する可能性があります。

EDIT:

あなたの元の質問に計算へのすべての入力がフロートリテラルを使用し、floatsなので。たとえば、1.0278は二重リテラルです。私。すべての計算は浮動小数点数であり、倍精度に昇格されていないような定数にfを追加します。

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

私は何をすることをお勧めしますか? – scarhand

+0

@scarhand編集を参照してください。浮動小数点数の使用について – frozenkoi

7

何このアプローチについて?ダブルからfloatにキャスト

質問のタイトル(ただし、特定のコンテンツ)へのより一般的な答えとして
Float.valueOf(String.valueOf(your_double_variable)); 
1

は、次のように行うことができます。

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

それとも、あなたの場合最初に浮動小数点として1.2と表記する必要があります。その後、1.2fを使用してください。

    float
  • は、変換精度を失うことが可能であるので、単精度32ビットとdoubleが倍精度64ビットです。 primitive data types documentationを参照してください。
関連する問題