为什么SQLite不能加上DECIMAL值?

时间:2015-04-15 16:19:31

标签: sqlite

    sqlite> create table test (Qty DECIMAL(10,2));
    sqlite> insert into test values(1059.79);
    sqlite> insert into test values(-1050);
    sqlite> insert into test values(83.58);
    sqlite> insert into test values(130.51);
    sqlite> insert into test values(-5);
    sqlite> insert into test values(-136.68);
    sqlite> insert into test values(-2.6);
    sqlite> insert into test values(-75);
    sqlite> insert into test values(-4.6);
    sqlite> select sum(Qty) FROM TEST;
    -6.21724893790088e-14

鉴于我明确指定DECIMAL(10,2)作为字段类型,为什么总和不是0?

3 个答案:

答案 0 :(得分:2)

SQLite没有DECIMAL类型。使用64位浮点值执行数学运算。

请参阅SQLite3 data types

答案 1 :(得分:1)

而不是搞乱,并使我的sql与我支持的其他数据库不兼容,我只是为SQLite SUM函数编写了一个用户定义的替换,如下所示:

[SqliteFunctionAttribute(Name = "SUM", Arguments = 1, FuncType = FunctionType.Aggregate)]
    class SqliteSum : SqliteFunction {
        public override void Step(object[] args, int stepNumber, ref object contextData) {
            if (args.Length < 1 || args[0] == null || args[0] == DBNull.Value)
                return;
            try {
                decimal d = Math.Round(Convert.ToDecimal(args[0]), 4);
                if (contextData != null) d += (Decimal)contextData;
                contextData = d;
            } catch (Exception ex) {
                WebServer.Log("Exception: {0}", ex);
            }
        }

        public override object Final(object contextData) {
            return contextData;
        }
    }

答案 2 :(得分:0)

SQLite没有十进制类型:

NULL
INTEGER
REAL
TEXT
BLOB

所以也许将它转换为Text,然后进行求和。 SQLite功能强大,可以依赖于计算和数学。