由于均值计算,意外为0

时间:2015-05-19 22:43:44

标签: android

作为我线程的一部分,我想计算30个读数的平均值。要计算它我使用公式

enter image description here

这是我的线程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.我在考虑类型转换的一些问题但是我不会得到第一个值。

1 个答案:

答案 0 :(得分:2)

由于您要分割两个int,因此您正在执行integer division,即仅保留结果的整个部分。

要获得浮点结果,将其中一个操作数定义为double就足够了。 e.g:

double calibrationCounter = 0.0;