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。但没有任何帮助。
我的代码中有浮动,在数据库模式中它是双倍的(尽管没有任何意义)
但我做了以下操作: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 ,并且我总是得到巨大的值。
现在对我来说效果很好。