在Android下使用计算选择列时丢失精度

时间:2012-06-13 11:47:28

标签: android sql ormlite

我在数据库中有不同的列。我使用ormlite并使用genericRawResults执行SQL。我的代码就像:

GenericRawResults<Total> rawResults =
    dao.queryRaw("select items*3 from Items", new RawRowMapper<Total>() {
        public Total mapRow(String[] columnNames,
            String[] resultColumns) throws SQLException {
                   return new Total(new BigDecimal(resultColumns[0]));
        }
        });

结果是一个丢失小数的数字。为什么?

我尝试使用强制转换(列名为REAL)但结果是一样的。我能做什么?感谢。

2 个答案:

答案 0 :(得分:0)

如果没有看到Sqlite架构并且没有看到String item*3的{​​{1}}结果,很难明确知道这里有什么问题。

我怀疑这不是ORMLite的问题。我怀疑这是Sqlite的限制,因为它使用小精度来进行内部计算。这是Sqlite命令行中的一个示例:

select 11312541243231.01*3;
33937623729693.0  // << note the missing .03

我建议您在您的查询中执行*3,而是在之后进行乘法将其转换为BigDecimal }。我猜是这样的:

BigDecimal big = new BigDecimal(resultColumns[0]);
big.multiply(new BigDecimal(3));

答案 1 :(得分:0)

我找到了解决方案!!!!!我将Real转换为Varchar,如下所示:

select id, factory, cast( SUM(Round((cast(Round((cast(price as REAL))*(cast((100-d1)/cast(100 as REAL) as REAL)),3) as REAL))* (cast((100-2)/cast(100 as REAL) as REAL)),3)* cast(units as REAL)) as VARCHAR) from Items group by id, factory

我不会丢失小数!!!!!