作为我线程的一部分,我想计算30个读数的平均值。要计算它我使用公式
这是我的线程run()
方法的代码(变量在线程之前定义 - 我只是让它们看看使用的变量类型):
//Thread's variables
float[] values;
String[] str1;
String[] str2;
int counter = 0;
int calibrationCounter = 0;
StringBuilder strBuilder;
ReadingsUpdateData updater;
String msg;
float[] calibrationValues;
public void run() {
while (true) {
try{
msg = inputList.poll();
} catch(NoSuchElementException nse){
continue;
}
if (msg == null) {
continue;
}
String[] msgArray = msg.split("!");
for (String m : msgArray) {
if (m.length() == 0) {
continue;
}
if(m.charAt(0)!='A'){
strBuilder.append(m);
continue;
} else {
str1 = strBuilder.toString().split(":");
if (str1.length != 2) {
if(str1.length>2){
strBuilder.delete(0,strBuilder.length());
continue;
}
strBuilder.append(m);
continue;
}
if (!str1[0].equals("ANG")) {
strBuilder.delete(0,strBuilder.length());
continue;
}
str2 = str1[1].split(",");
if (str2.length != 3) {
if(str2.length >3){
strBuilder.delete(0,strBuilder.length());
strBuilder.append(m);
continue;
}
strBuilder.append(m);
continue;
}
try {
if(readingsCalibration) {
if(calibrationCounter<30) {
Log.d(LOG_TAG,calibrationValues[0] + " = (1/(" +calibrationCounter +"+1))*("+calibrationValues[0] + "*"+calibrationCounter +"+"+str2[0]+"))");
calibrationValues[0] = (1/(calibrationCounter + 1))*
(calibrationValues[0]*calibrationCounter+Float.parseFloat(str2[0]));
calibrationValues[1] = (1/(calibrationCounter + 1))*
(calibrationValues[1]*calibrationCounter+Float.parseFloat(str2[1]));
calibrationValues[2] = (1/(calibrationCounter + 1))*
(calibrationValues[2]*calibrationCounter+Float.parseFloat(str2[2]));
calibrationCounter++;
} else {
readingsCalibration = false;
calibrationCounter = 0;
}
} else {
values[0] = Float.parseFloat(str2[0]) - calibrationValues[0];//x
values[1] = Float.parseFloat(str2[1]) - calibrationValues[1];//y
values[2] = Float.parseFloat(str2[2]) - calibrationValues[2];//z
updater.setData(values);
EventBus.getDefault().post(updater);
}
} catch (NullPointerException npe) {
} catch (NumberFormatException nfe) {
}
strBuilder.delete(0,strBuilder.length());
strBuilder.append(m);
}
}
}
}
不幸的是,我一直只得到零。只有在第一次运行时,我得到一些值,但是下一个,然后每个给出0.我在考虑类型转换的一些问题但是我不会得到第一个值。
答案 0 :(得分:2)
由于您要分割两个int
,因此您正在执行integer division,即仅保留结果的整个部分。
要获得浮点结果,将其中一个操作数定义为double
就足够了。 e.g:
double calibrationCounter = 0.0;