Android / SQLite: сохранение / получение данных типа REAL - PullRequest
2 голосов
/ 28 января 2012

У меня есть SQLDB с таблицей поля REAL.В моем макете я установил размер поля, чтобы разрешить только 8 + 2 цифры.В моем объекте я использовал тип данных поля как «float».

qs[0] = "CREATE TABLE " + RELATION_TABLE_NAME + "(id TEXT PRIMARY KEY, name TEXT NOT NULL, startBal REAL NOT NULL, currentBal REAL NOT NULL);";

<EditText android:text="" android:id="@+id/relCurrBalTxt" style="@style/EditTextStyle"
 android:inputType="numberDecimal" android:maxLength="11" android:hint="12345678.99" />

Я ввел значение «87654321.99» в своем editText и нажал «Сохранить».Он заполняет объект

// Send the data to object 
rowData.setValue(2, Float.parseFloat(sbalTxt.getText().toString()));
// In object, this is how I save it
this.setCurrentBalance( ((Float)value).floatValue() );  // value is Object type

// Saving data in ContenteValues to save to DB
// LOG Rcvd from Object while Saving CurrBal: 8.765432E7
values.put("currentBal", new Float(rowData.getValue(3).toString()));

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

    field_type = r.getFieldType(field);
// Get Data
str = r.getValue(field).toString();

// Format accordingly
if(field_type.equals(DBRow.DOUBLE_TYPE) || field_type.equals(DBRow.FLOAT_TYPE)) {
        double douValue = Double.parseDouble(str);
            //NumberFormat nf = NumberFormat.getNumberInstance(Locale.ITALY);
            //DecimalFormat df = (DecimalFormat) nf;
            DecimalFormat df = new DecimalFormat();
            df.applyPattern("##,###,###.##");
            df.setGroupingUsed(true);
            str = df.format(douValue);
        //  Log.v("DF", "While Showing in Table : double = " + douValue + " String = " + str);
        } 

((TextView) tr.getChildAt(field)).setText(str);

ЗДЕСЬ он показал мне значение: 8.765432E7

Когда я снова выбрал эту строку, чтобы увидетьзначения в EditText я вижу: 87654320.00

Как изменяется значение?В другом случае я также сохранил данные как «50009876,99», но почему-то не сохраняет 0,99, а делает их как .00, т.е. 50009876,00.

Почему все работает неправильно?Где я иду не так?

Любая помощь высоко ценится.

* РЕДАКТИРОВАТЬ: код DecimalFromat используется для отображения в таблице *

        // Format accordingly
    if(field_type.equals(DBRow.DOUBLE_TYPE) || field_type.equals(DBRow.FLOAT_TYPE)) {
        /*
                      WAS USING THIS CODE TILL NOW
    DecimalFormatSymbols dfs = new DecimalFormatSymbols();  
    String decep = String.valueOf(dfs.getDecimalSeparator());
    int index = str.indexOf(decSep); 
    if (index > 0) {
       // If digits after decimal are more than 2
       if (str.substring(index+1).length() > 2) {
        str = str.substring(0, index+3);
    }
    }
    DecimalFormat df = new DecimalFormat();
            df.setGroupingUsed(true);
            str = df.format(Double.parseDouble(str));

            if (addRow)
        create_addTextView(tr, str, true); 
    else 
        ((TextView) tr.getChildAt(field)).setText(str);

            */

                 // DECIMALFORMAT CODE
            double douValue = Double.parseDouble(str);
            DecimalFormat df = new DecimalFormat();
            df.applyPattern("##,###,###.##");
            df.setGroupingUsed(true);
            str = df.format(douValue);

            if (addRow)
       create_addTextView(tr, str, true); 
    else 
      ((TextView) tr.getChildAt(field)).setText(str);

}

1 Ответ

5 голосов
/ 28 января 2012

Я думаю, что ваша проблема в том, что вы храните числа как Float. Float не имеет очень хорошей точности - на самом деле он имеет только 23 двоичных знака точности, как видно здесь . Это означает, что вы не можете точно хранить в float 7 цифр до десятичной точки или, что еще хуже, - 7 цифр до точки и пару после. Это означает, что вы неправильно выбрали тип переменной сальдо - вы не можете сохранить в Float 8 + 2. Я бы порекомендовал вам изменить тип на Double, который имеет значительно больший диапазон точности.

...