簡體   English   中英

在SQLite中存儲浮點值會更改Room DB中的小數精度

[英]Storing a float value in SQLite changes the decimal precision in Room DB

我需要將價格存儲在我的房間數據庫中。 我可以得到2位小數或3位小數的小數精度,具體取決於我的應用程序所在的國家/地區。

使用android的房間庫在sqlite數據庫中存儲float或甚至double值時,它會更改值。 例如:14.54存儲為14.539999961853

在調試時,我發現只有在我傳遞給插入的列表中,該值才是14.54。 但是從Windows的SQLite瀏覽器應用程序中檢查已保存的記錄。 我看到價值觀發生了變化。 我使用sqlite瀏覽器手動輸入了一個查詢,值保存原樣(浮點值不改變精度)。 例如:

("INSERT INTO MYTABLE (ItemPrice) VALUES (14.54)");

上面的查詢成功執行並插入14.54的浮點數

但在android中使用以下內容

@Insert 
Long[] saveMyTable(final List<MYTABLE> myTable);

MyTable實體的字段為

public float ItemPrice;

插入上述查詢時,值會發生變化

我也嘗試將DB Schema中的數據類型更改為real,float,double。 但沒有任何幫助。

我正在使用房間數據庫用於演示應用程序,那時我的存儲值與上面定義的相同值。 首先為表定義pojo類..

@Entity
public class MyTable {
@PrimaryKey(autoGenerate = true)
private int id;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

private double ItemPrice;

public double getItemPrice() {
    return ItemPrice;
}

public void setItemPrice(double itemPrice) {
    ItemPrice = itemPrice;
}

}

然后在定義dao類之后......

@Dao
public interface MyTableDao {
@Insert
void insertData(MyTable myTable);

}

然后在表格中定義db之后...

@Database(entities = {MyTable.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract MyTableDao getTableDao();
}

然后在主要活動中使用下面的代碼定義db名稱,版本並插入數據...

public class DbInsert extends AppCompatActivity {
AppDatabase db;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "MyDb").allowMainThreadQueries().build();
    MyTable myTable = new MyTable();
    myTable.setItemPrice(14.54);
    db.getTableDao().insertData(myTable);
}
}

我在我的代碼和db模式中浮動它是雙倍的(盡管dosent意味着什么)

但我做了以下事情:1。在代碼和db中使用相同的數據類型(我使用double來表示精度)2。存儲值時。 我完成了雙倍的需求。

public static short COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL;//Dynamically set
private static int ROUNDING_MODE = BigDecimal.ROUND_HALF_EVEN;

public double roundedDouble(double doubleValue) {
    return new 
BigDecimal(doubleValue).setScale(COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL, 
ROUNDING_MODE).doubleValue();
}

3.上述方法將返回一個帶有2或3位小數的雙精度,具體取決於我在COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL中設置的值。 4.最后,我將值存儲在DB中。

Ps:沒有上面的方法,我的浮點數總是會收斂到默認小數的兩倍,我總是得到巨大的價值。

現在它對我來說很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM