2013-02-24 4 views
3

Так что я этот код, в основном применяя простые математические арифметические переменные. rrdistance, qsdistance, heartrate дают желаемые значения, а pamp и qamp - нет. Думаю, округляется? Предположительно, при i = 1 значения испытания [1] равны 120, Pycoor [1] равен 102, а Qycoor [1] равен 134. FINALBOXWIDTH (bitmap_Source) равен 10.Результат результата непреднамеренно округляется?

Таким образом, ожидаемые результаты pamp = ((120-102)/10) * 0,1 = 0,18, в то время как qamp = ((134-120)/10) * 0,1 = 0,14

Я не понимаю, почему оба дисплея отображают pamp = 0,1 и qamp = 0,1.

static int[] Pxcoor = new int[50]; 
static int[] Pycoor = new int[50]; 
static int[] Qxcoor = new int[50]; 
static int[] Qycoor = new int[50]; 
static int[] Rxcoor = new int[50]; 
static int[] Rycoor = new int[50]; 
static int[] Sxcoor = new int[50]; 
static int[] Sycoor = new int[50]; 
static int[] Txcoor = new int[50]; 
static int[] Tycoor = new int[50]; 
    static int[] trial = new int[450]; 

public static int FINALBOXWIDTH(Bitmap src) { ... 
} 

private void StratBackgroundProcess() { 

if (i >= 2) { 
    rrdistance += (((Rxcoor[i] - Rxcoor[i - 1])/FINALBOXWIDTH(bitmap_Source)) * 0.04); 
    //durations in seconds 
    printerval += (((Rxcoor[i] - Pxcoor[i])/FINALBOXWIDTH(bitmap_Source)) * 0.04); 
    qsdistance += (((Sxcoor[i] - Qxcoor[i])/FINALBOXWIDTH(bitmap_Source)) * 0.04); 
    heartrate += (1500/(rrdistance/0.04)); 

    //amplitude in mV 
    pamp = (((trial[1] - Pycoor[i])/FINALBOXWIDTH(bitmap_Source)) * 0.1); 
    qamp = (((Qycoor[i] - trial[i])/FINALBOXWIDTH(bitmap_Source)) *0.1); 


    } 
} 

Pamp = pamp; Qamp = qamp;

coord.setText ("" + pamp + "," + qamp + "");

+0

Укажите типы данных для всех переменных/параметров, показанных здесь. – CommonsWare

+0

Как объявляются эти переменные? Может быть, есть целые числа? – 323go

+0

Я редактирую код, добавленные типы данных @CommonsWare – cookie23

ответ

3

Проблема почти наверняка заключается в декларации суда, продуктов Pycoor, Qycoor и FINALBOXWIDTH. Если это целые числа (и они почти наверняка получены из ваших результатов), то:

((120-102)/10) * 0,1 = (18/10) * 0,1 = 1 (примечание целочисленная математика округляется) * 0.1 = 0.1

Теперь я фактически не знаю значений в пробной версии и т. Д., Так как вы их не предоставили (ну, с тех пор, как это было, и это подтверждает мою работу), но попробуйте изменить эти два линии до:

pamp = (((trial[1] - Pycoor[i])/(double)FINALBOXWIDTH(bitmap_Source)) * 0.1); 
    qamp = (((Qycoor[i] - trial[i])/(double)FINALBOXWIDTH(bitmap_Source)) *0.1); 

Примечания Я просто заставил FINALBOXWIDTH двойного типа, который заставит арифметику с плавающей точкой.

Обратите внимание: вы получите двойные значения, которые не всегда хорошо отображаются. Попробуйте следующее:

DecimalFormat df = new DecimalFormat("#.##"); 
System.out.println(df.format(pamp)); 
System.out.println(df.format(qamp)); 
+0

Я пробовал то, что вы предложили, но qamp отображал что-то вроде 0.18000000000002, а qamp - 0.13999999999 @Bill James – cookie23

+0

Хорошо, это неправильно? Каковы значения для испытаний [1], Pycoor [1] и Qycoor [1] и каков результат вызова FINALBOXWIDTH? – billjamesdev

+0

Что я могу сделать, чтобы сделать его всего 0,18 и 0,14? – cookie23

-1

Это может быть из-за типов данных, которые вы используете.
1. Убедитесь, что типы данных всех переменных, участвующих в вычислении, являются либо плавающими, либо двойными (или любым другим типом данных, который хорошо обрабатывает десятичные знаки, такие как Decimal, BigDecimal и т. Д.)
2. При использовании значений float в формулу необходимо указать их с f. Таким образом, ваша формула должна быть

pamp = (((trial[1] - Pycoor[i])/FINALBOXWIDTH(bitmap_Source)) * 0.1f); 
qamp = (((Qycoor[i] - trial[i])/FINALBOXWIDTH(bitmap_Source)) *0.1f); 
+0

Умм, если это целочисленная математическая проблема, «объявление» 0.1 как плавающего слишком поздно и ненужное, поскольку оно уже является числом с плавающей запятой. – billjamesdev