Ответ 1
Вы пробовали это?
float onerm = (float) (weigth/(1.0278-(.0278*reps)));
В моей базе данных у меня есть пара реальных полей.
Вот структура:
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(), и ничего не работает.
Вы пробовали это?
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
имеет более высокую точность, чем float
. Вы потеряете информацию при выполнении этого задания. Вот почему компилятор не позволяет вам это делать. Это похоже на то, что происходит, когда вы хотите сделать char b = a
, где a - int
.
Использование явного приведения может позволить вам скомпилировать, но потеря данных/точности может произойти.
EDIT:
Так как в исходном вопросе все входы для расчета floats
, используйте float-литералы. Например, 1.0278
является двойным литералом. То есть добавьте f
к константам таким образом, чтобы все вычисления были поплавками и не были увеличены до удвоений:
float onerm = weight/(1.0278f-(.0278f*reps));
В моем случае у вас есть переменная Double
, вы можете вызвать Double.floatValue()
следующим образом:
Double deg = 45.0d;
float floatDeg = deg.floatValue();