web-dev-qa-db-ja.com

ダブルからフロートに変換できません

私のデータベースには、いくつかの「実際の」フィールドがあります。

構造は次のとおりです。

    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()を使用してみましたが、何も機能しないようです。

12
scarhand

これを試しましたか?

float onerm = (float) (weigth/(1.0278-(.0278*reps)));
29
WLin

このアプローチはどうですか?

Float.valueOf(String.valueOf(your_double_variable));
15
Ahmad Raza

ダブルからフロートへのキャストは、次のように実行できます。

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

または、最初に1.2をフロートとして表現する必要がある場合は、1.2fを使用します。

  • floatは32ビットの単精度、doubleは64ビットの倍精度であるため、変換の精度が失われる可能性があります。 基本データ型のドキュメント を参照してください。
6
Suragch

私の場合、Double変数がある場合、次のようにDouble.floatValue()を呼び出すことができます。

Double deg = 45.0d;
float floatDeg = deg.floatValue();
3
arenaq

問題は、double型がfloatよりも高い精度であることです。その割り当てを行うと、情報が失われます。コンパイラがそれをさせないのはそのためです。それはあなたがしたいときに起こることと似ていますchar b = aここで、aはintです。

明示的なキャストを使用するとコンパイルできる場合がありますが、データ/精度が失われる可能性があります。

編集:

元の質問では、計算へのすべての入力はfloatsであるため、floatリテラルを使用します。例えば、 1.0278は二重リテラルです。つまりすべての計算がfloatであり、doubleに昇格されないように、定数にfを追加します。

float onerm = weight/(1.0278f-(.0278f*reps));
2
frozenkoi