4

float 値 widt SQLiteDatabase.insert を保存すると、保存された値は元の値とは異なります。以下を参照してください。

データベースの幅があります:

db.execSQL("CREATE TABLE IF NOT EXISTS info_values ("
    + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
    + "date DATE UNIQUE NOT NULL, "
    + "value REAL NOT NULL)");

たとえば 33.3 幅を挿入すると、次のようになります。

private class inputdlg_ok implements input_dlg.ReadyListener {
    public void ready(float newvalue) {
      Date d = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      ContentValues values = new ContentValues();
      values.put("date", sdf.format(d));
      values.put("value", newvalue);

      database.insert("info_values", null, values);

私はこれらを持っています:

sqlite> select * from info_values;
83|2012-04-04 09:06:22|33.2999992370605
84|2012-04-02 09:05:57|22.2000007629395

width execをテストしました:

 String sql = "INSERT INTO info_values (date, value) " + 
              "VALUES ('" + sdf.format(d) + "'," + Float.toString(newvalue) + ")";
database.execSQL(sql);

そしてそのフォームはうまく機能します。

何か案が?

4

1 に答える 1

10

このスレッドが他の人に役立つとは思っていませんでしたが、ここで.

基本的にあなたの問題はfloat、Javaコードの型に使用することです。Float の精度は非常に低いです。リンク先のスレッドと、すべてのコメントおよびリンクされたチャットを読んでください。それでも問題が解決しない場合は、返信してください。

double 値がコンピューターに特定の精度までしか格納されないことは、おそらくご存じでしょう。データベースでは値が奇妙に見えますが、これは、float を使用したときに得られる値の最良の概算です。double を使用すると精度を上げることができますが、完全な状態にはなりません。おそらく、データベース内の実際のサイズを制限する正確な値を取得することを主張する場合は、行く方法かもしれません.

編集精度の問題だと思わせることができなかったので、次のプログラムを含めます。

float f = 22.2;
printf("The number is: %.9f\n", f);

出力は次のとおりです。

22.200000763

試してみることをお勧めします。ご覧のとおり、これはまさにあなたが指摘した数字です。

于 2012-04-14T13:11:51.530 に答える