下面是我在SQLite数据库中创建的表,
CREATE TABLE MyData(
Code VARCHAR(20),
Amount DECIMAL(18, 8)
);
然后我在表格中插入2行。
INSERT INTO MyData
VALUES('A', 1.12345678);
INSERT INTO MyData
VALUES('B', 1234567890.12345678);
之后,执行SELECT语句
SELECT * FROM MyData;
SQLite返回以下结果:
A|1.12345678
B|1234567890.12346
DECIMAL(18,8)假设精度= 18且scale = 8,为什么有些小数位被截断?
答案 0 :(得分:3)
有关sqlite如何存储其数据的详细信息,请参阅here。指定DECIMAL列类型时,列的存储具有NUMERIC关联。
第2.0节有关于类型亲和性的以下描述:
具有NUMERIC亲和力的列可能包含使用全部五个值的值 存储类。当文本数据插入NUMERIC列时, 文本的存储类转换为INTEGER或REAL(按顺序) (如果这种转换是无损且可逆的)。对于 SQLite认为,TEXT和REAL存储类之间的转换 如果前15个转换为无损且可逆转 保留该数字的有效十进制数字。如果 无法将TEXT无损转换为INTEGER或REAL 使用TEXT存储类存储该值。没有尝试 转换NULL或BLOB值。
这表明sqlite将尝试类型之间的转换,如果数字的前15位可以转换和反转,则数字被认为是相等的。这有效地限制了可用的精度,可以将数字存储到15位有效数字。
wikipedia article on double precision floating point numbers有其他信息,在处理浮点数时非常有用。