Не может конвертировать из double в float

В моей базе данных у меня есть пара реальных полей.

Вот структура:

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

Я застрял здесь. Это дает мне ошибку "невозможно преобразовать из double в float" для onerm. Я попытался отличить вес как float, используя (Float) перед ним, я пробовал использовать weight.floatValue(), и ничего не работает.

Ответ 1

Вы пробовали это?

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

Ответ 2

Как насчет этого подхода?

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

Ответ 3

Преобразование из двойного в число с плавающей точкой можно сделать так:

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

Или, если вам просто нужно выразить 1.2 как число с плавающей точкой для начала, тогда используйте 1.2f.

Заметка

  • float является одинарной точности 32-битных и double в двойной точности 64-бит, так что можно потерять точность в преобразовании. Смотрите документацию по примитивным типам данных.

Ответ 4

Проблема заключается в том, что тип double имеет более высокую точность, чем float. Вы потеряете информацию при выполнении этого задания. Вот почему компилятор не позволяет вам это делать. Это похоже на то, что происходит, когда вы хотите сделать char b = a, где a - int.

Использование явного приведения может позволить вам скомпилировать, но потеря данных/точности может произойти.

EDIT:

Так как в исходном вопросе все входы для расчета floats, используйте float-литералы. Например, 1.0278 является двойным литералом. То есть добавьте f к константам таким образом, чтобы все вычисления были поплавками и не были увеличены до удвоений:

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

Ответ 5

В моем случае у вас есть переменная Double, вы можете вызвать Double.floatValue() следующим образом:

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