在 SQLite 中存储浮点值会更改 Room DB 中的小数精度

Uza*_*air 6 sqlite android android-sqlite android-room

我需要将价格存储在我的房间数据库中。根据使用我的应用程序的国家/地区,我可以拥有 2 位小数或 3 位小数的小数精度。

在使用android的房间库在sqlite数据库中存储float甚至double值时,它会更改值。例如:14.54 存储为 14.539999961853

在调试时,我只能在传递给 insert 的列表中找到值 14.54。但是在从适用于 Windows 的 SQLite 浏览器应用程序中检查保存的记录时。我看到价值观发生了变化。我已经使用 sqlite 浏览器手动输入了一个查询,并且该值按原样保存(浮点值而不改变精度)。例如:

("INSERT INTO MYTABLE (ItemPrice) VALUES (14.54)");
Run Code Online (Sandbox Code Playgroud)

以上查询执行成功,插入14.54的浮点数

但是在android中使用以下

@Insert 
Long[] saveMyTable(final List<MYTABLE> myTable);
Run Code Online (Sandbox Code Playgroud)

MyTable 实体有一个字段作为

public float ItemPrice;
Run Code Online (Sandbox Code Playgroud)

插入上述查询时,值已更改

我还尝试将 DB Schema 中的数据类型更改为 real、float、double。但没有任何帮助。

Uza*_*air 0

我的代码中有浮动,在数据库模式中它是双倍的(尽管没有任何意义)

但我做了以下操作:1.在代码和数据库中使用相同的数据类型(我使用双精度)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();
}
Run Code Online (Sandbox Code Playgroud)

3. 上述方法将返回一个带有 2 或 3 位小数的双精度值,具体取决于我在 COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL 中设置的值。4.最后我将值存储在数据库中。

Ps:如果没有上述方法,我的 float 总是会转换为带有默认小数的 double ,并且我总是得到巨大的值。

现在对我来说效果很好。