2012-04-14 30 views
4

當我存儲浮點值WIDT SQLiteDatabase.insert所存儲的值將是比原來的不同,見下文:Android開發 - SQLite的存儲浮子

我有一個數據庫寬度:

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 

我已經測試寬度高管:

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

和形式的作品好。

有什麼想法嗎?

回答

10

從來沒有想過這個線程會幫助任何人,但allas在這裏它goes

基本上你的問題是你在java代碼中使用float作爲類型。浮法精度非常低。閱讀我鏈接的主題,以及所有評論和關聯聊天。如果您仍然有任何問題,請回復。

您可能知道,在計算機中只能保存一定的精度。儘管這些值在數據庫中看起來很奇怪,但這是使用float時可以得到的值的最佳近似值。加倍可以提高精度,但你永遠不會達到完美的狀態。也許如果你堅持要獲得限制數據庫中實際大小的精確值可能是一種方法。

編輯,因爲我無法讓你相信這是一個精密的問題,我有以下程序:

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

輸出是:

22.200000763 

我建議你試試。正如你所看到的,這正是你指出的數字。

+0

我甚至知道爲什麼我會使用float以及Google爲什麼在API中使用各處。因爲它是32位CPU中的32位,並且精度足夠。 – Tectona 2012-04-14 18:06:13

+0

@vkaci然後就是不用擔心精度。然而,速度差異是真的可以忽略我認爲(我從來沒有發現任何顯着差異)。你也可以參考這個主題:http://stackoverflow.com/q/1074474/1108032 – 2012-04-14 18:10:42

+0

對不起。這裏的情況是數字是22.2,並且存儲爲22.2000007629395。這不是精確問題!浮點數是22.2,在ContentValues.put之後數字仍然是22.2(getAsString,getASFloat),但是在插入過程中發生了一些事情。我認爲這是一個API錯誤。 – Tectona 2012-04-14 18:11:06