私のデータベースには、いくつかの「実際の」フィールドがあります。
構造は次のとおりです。
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に変換できません」というエラーが表示されます。ウェイトの前に(Float)を使用してウェイトをフロートとしてキャストしようとしましたが、weight.floatValue()を使用してみましたが、何も機能しないようです。
これを試しましたか?
float onerm = (float) (weigth/(1.0278-(.0278*reps)));
このアプローチはどうですか?
Float.valueOf(String.valueOf(your_double_variable));
ダブルからフロートへのキャストは、次のように実行できます。
double d = 1.2;
float f = (float) d;
または、最初に1.2
をフロートとして表現する必要がある場合は、1.2f
を使用します。
注
float
は32ビットの単精度、double
は64ビットの倍精度であるため、変換の精度が失われる可能性があります。 基本データ型のドキュメント を参照してください。私の場合、Double
変数がある場合、次のようにDouble.floatValue()
を呼び出すことができます。
Double deg = 45.0d;
float floatDeg = deg.floatValue();
問題は、double
型がfloat
よりも高い精度であることです。その割り当てを行うと、情報が失われます。コンパイラがそれをさせないのはそのためです。それはあなたがしたいときに起こることと似ていますchar b = a
ここで、aはint
です。
明示的なキャストを使用するとコンパイルできる場合がありますが、データ/精度が失われる可能性があります。
編集:
元の質問では、計算へのすべての入力はfloats
であるため、floatリテラルを使用します。例えば、 1.0278
は二重リテラルです。つまりすべての計算がfloatであり、doubleに昇格されないように、定数にf
を追加します。
float onerm = weight/(1.0278f-(.0278f*reps));